0
Java 库为什么要这么写?
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.
我一般都是
int a = getNumber(); if(a >0)…….
但是我看到源码写法很多是
int a; if((a=getNumber()) >0)…….
为什么会这么写?是有什么好处吗
int a = getNumber(); if(a >0)…….
但是我看到源码写法很多是
int a; if((a=getNumber()) >0)…….
为什么会这么写?是有什么好处吗
26 条回复 • 2021-10-26 10:08:02 +08:00
546L5LiK6ZOt 10 小时 13 分钟前 2
我记得很多类库还有一个常见的写法,就是在一个方法里,把类的成员变量赋值给局部变量,方法里都使用这个局部变量,而不直接用成员变量。例如:
class A {
int a;
void func() {
int a = this.a;
// ……
}
}
后来看到一种解释,说访问方法里成员变量不利于运行时优化(至少局部变量肯定是线程安全的)。
我记得 jdk 的类库里还经常看到这么种情况,明明这两个循环可以写在一起,合并成一个循环,但是却特地分开写。一种解释说,小的循环容易让 cpu 命中 cache ,执行更快。。。
总之,类库总有些特殊的写法,跟写业务代码不一样
class A {
int a;
void func() {
int a = this.a;
// ……
}
}
后来看到一种解释,说访问方法里成员变量不利于运行时优化(至少局部变量肯定是线程安全的)。
我记得 jdk 的类库里还经常看到这么种情况,明明这两个循环可以写在一起,合并成一个循环,但是却特地分开写。一种解释说,小的循环容易让 cpu 命中 cache ,执行更快。。。
总之,类库总有些特殊的写法,跟写业务代码不一样
rpish 1 小时 42 分钟前
cpstar 19 分钟前
从编译出的 bytecode 上,这两个没差别,也无所谓性能调优。
都是先 invoke 再 ifgt 。
如果说性能调优,那就是 9#说的问题,局部变量,不需要每次都 invoke——当然编译器也可能自动识别并且加上一个局部变量压栈
都是先 invoke 再 ifgt 。
如果说性能调优,那就是 9#说的问题,局部变量,不需要每次都 invoke——当然编译器也可能自动识别并且加上一个局部变量压栈
ipwx 10 分钟前
if 这么写就是魔怔了。。。
但是如果换成 while ,这么写就爽了。比如:
int bytesRead;
while ((bytesRead = read(fd)) > 0) {
...
}
对比如果不这么写:
while (true) {
int bytesRead = read(fd);
if (bytesRead <= 0) {
break;
}
...
}
显然前者更简洁。
但是如果换成 while ,这么写就爽了。比如:
int bytesRead;
while ((bytesRead = read(fd)) > 0) {
...
}
对比如果不这么写:
while (true) {
int bytesRead = read(fd);
if (bytesRead <= 0) {
break;
}
...
}
显然前者更简洁。
skinny 7 分钟前
可能没什么特殊用意,可能就是写这部分代码的人有一些在 C/C++的不良习惯而已,这写法不是特殊需要在 C/C++也不是推荐写法啊。后面更新维护的人也不会在没有明显问题时去动它,于是就保留了下来。JVM 优化不会这么挫的。说起库源代码违反最佳写法官方推荐写法的多了去了,比如 Python ,就很多问题,但是没人愿意去更新源代码。
Recommend
About Joyk
Aggregate valuable and interesting links.
Joyk means Joy of geeK