0

Java 库为什么要这么写?

 2 years ago
source link: https://www.v2ex.com/t/810481
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

V2EX  ›  Java

Java 库为什么要这么写?

  monster1priest · 12 小时 32 分钟前 via iPhone · 2052 次点击
我一般都是
int a = getNumber(); if(a >0)…….
但是我看到源码写法很多是
int a; if((a=getNumber()) >0)…….
为什么会这么写?是有什么好处吗
26 条回复    2021-10-26 10:08:02 +08:00

bololobo

bololobo   12 小时 19 分钟前

能显得比较厉害。别人问我为什么要这样写,我就会说 你看源码也这样写

monster1priest

monster1priest   12 小时 18 分钟前 via iPhone

@bololobo hashmap 就是这么写的。人家应该不是为了炫耀吧

BBCCBB

BBCCBB   12 小时 16 分钟前

一般是
int a;
if (xxx && (a=getNumber() > 0)) 这样吧,
不能只有一个条件也 f((a=getNumber()) >0)/

cmdOptionKana

cmdOptionKana   11 小时 38 分钟前   ❤️ 2

有 C 语言背景可能会习惯这样写

rannnn

rannnn   11 小时 33 分钟前

这么写一般是在 while 里吧

zardmyLove

zardmyLove   11 小时 18 分钟前

我的想法是显得紧凑

zjsxwc

zjsxwc   11 小时 16 分钟前 via Android

感觉,莫名好笑😄

546L5LiK6ZOt

546L5LiK6ZOt   10 小时 13 分钟前   ❤️ 2

我记得很多类库还有一个常见的写法,就是在一个方法里,把类的成员变量赋值给局部变量,方法里都使用这个局部变量,而不直接用成员变量。例如:
class A {
int a;

void func() {
int a = this.a;
// ……
}
}

后来看到一种解释,说访问方法里成员变量不利于运行时优化(至少局部变量肯定是线程安全的)。


我记得 jdk 的类库里还经常看到这么种情况,明明这两个循环可以写在一起,合并成一个循环,但是却特地分开写。一种解释说,小的循环容易让 cpu 命中 cache ,执行更快。。。

总之,类库总有些特殊的写法,跟写业务代码不一样

mritd

mritd   8 小时 41 分钟前 via iPhone

@546L5LiK6ZOt #9 这种好像是为了满足那些 get set 规范

Jooooooooo

Jooooooooo   8 小时 30 分钟前

这是习惯问题

两种写法还能用性能差异那是 jvm 有毛病

chendy

chendy   1 小时 44 分钟前

没啥好处,甚至不太好读
是源码还是反编译?反编译的话经常看到一些奇怪的写法,但是都是编译器优化导致的

rpish

rpish   1 小时 42 分钟前

yidinghe

yidinghe   1 小时 32 分钟前 via Android

不看上下文的话,每次都这么写是脱裤子放屁,但确实有合理使用的场景,一般都是在 IO 流读取时出现。

Cbdy

Cbdy   1 小时 29 分钟前

IO 时会这样写,C 语言延续下来的传统,我记得 Unix 高程称赞过这种写法

Leviathann

Leviathann   53 分钟前 via iPhone

这就是 c 味
反正我挺不喜欢的

micean

micean   51 分钟前 via Android

@zjsxwc 那不需要声明 a 变量

aguesuka

aguesuka   45 分钟前

就是 4 楼的说法, 请相信这种简单的优化, 编译器比人更聪明.

bk201

bk201   32 分钟前

语意应该浅显易懂,我觉得源码这处不行

cubecube

cubecube   31 分钟前

@aguesuka 然而有时候编译器并不会更聪明。
javac 近些年几乎保持不变。很多 jdk 的代码的确有部分优化,至于这种方式是否有神秘性能加成,回头可以分析下。

wolfie

wolfie   26 分钟前

简洁啊。

举例不对,这个例子没有任何必要。

cpstar

cpstar   19 分钟前

从编译出的 bytecode 上,这两个没差别,也无所谓性能调优。
都是先 invoke 再 ifgt 。

如果说性能调优,那就是 9#说的问题,局部变量,不需要每次都 invoke——当然编译器也可能自动识别并且加上一个局部变量压栈

yinzhili

yinzhili   13 分钟前

一些人原先习惯了其它的编程语言,写 Java 代码的时候就会带上之前的习惯,比如:喜欢用下划线开头的变量名

ipwx

ipwx   10 分钟前

if 这么写就是魔怔了。。。

但是如果换成 while ,这么写就爽了。比如:

int bytesRead;
while ((bytesRead = read(fd)) > 0) {
...
}

对比如果不这么写:

while (true) {
int bytesRead = read(fd);
if (bytesRead <= 0) {
break;
}
...
}

显然前者更简洁。

skinny

skinny   7 分钟前

可能没什么特殊用意,可能就是写这部分代码的人有一些在 C/C++的不良习惯而已,这写法不是特殊需要在 C/C++也不是推荐写法啊。后面更新维护的人也不会在没有明显问题时去动它,于是就保留了下来。JVM 优化不会这么挫的。说起库源代码违反最佳写法官方推荐写法的多了去了,比如 Python ,就很多问题,但是没人愿意去更新源代码。

clf

clf   2 分钟前

有没有可能第二种的 a 作用域只在 if 的括号里,所以这样写。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK