Java 库为什么要这么写?

2021-10-25 21:37:22 +08:00
 monster1priest
我一般都是
int a = getNumber(); if(a >0)…….
但是我看到源码写法很多是
int a; if((a=getNumber()) >0)…….
为什么会这么写?是有什么好处吗
7242 次点击
所在节点    Java
50 条回复
bololobo
2021-10-25 21:50:50 +08:00
能显得比较厉害。别人问我为什么要这样写,我就会说 你看源码也这样写
monster1priest
2021-10-25 21:51:44 +08:00
@bololobo hashmap 就是这么写的。人家应该不是为了炫耀吧
BBCCBB
2021-10-25 21:53:41 +08:00
一般是
int a;
if (xxx && (a=getNumber() > 0)) 这样吧,
不能只有一个条件也 f((a=getNumber()) >0)/
cmdOptionKana
2021-10-25 22:31:04 +08:00
有 C 语言背景可能会习惯这样写
rannnn
2021-10-25 22:36:23 +08:00
这么写一般是在 while 里吧
zardmyLove
2021-10-25 22:51:57 +08:00
我的想法是显得紧凑
zjsxwc
2021-10-25 22:52:32 +08:00
因为这个变量 a 只是单纯想在 if 条件中使用?
而 if 的 condition 里不能 declare 变量 a 类型,不得不挪到外面。

https://stackoverflow.com/questions/16148580/assign-variable-value-inside-if-statement
zjsxwc
2021-10-25 22:53:51 +08:00
感觉,莫名好笑😄
546L5LiK6ZOt
2021-10-25 23:56:42 +08:00
我记得很多类库还有一个常见的写法,就是在一个方法里,把类的成员变量赋值给局部变量,方法里都使用这个局部变量,而不直接用成员变量。例如:
class A {
int a;

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

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


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

总之,类库总有些特殊的写法,跟写业务代码不一样
mritd
2021-10-26 01:28:45 +08:00
@546L5LiK6ZOt #9 这种好像是为了满足那些 get set 规范
Jooooooooo
2021-10-26 01:39:44 +08:00
这是习惯问题

两种写法还能用性能差异那是 jvm 有毛病
chendy
2021-10-26 08:25:08 +08:00
没啥好处,甚至不太好读
是源码还是反编译?反编译的话经常看到一些奇怪的写法,但是都是编译器优化导致的
rpish
2021-10-26 08:27:36 +08:00
@546L5LiK6ZOt
@zjsxwc
感谢两位老哥,涨姿势了👍
yidinghe
2021-10-26 08:37:10 +08:00
不看上下文的话,每次都这么写是脱裤子放屁,但确实有合理使用的场景,一般都是在 IO 流读取时出现。
Cbdy
2021-10-26 08:40:33 +08:00
IO 时会这样写,C 语言延续下来的传统,我记得 Unix 高程称赞过这种写法
Leviathann
2021-10-26 09:16:41 +08:00
这就是 c 味
反正我挺不喜欢的
micean
2021-10-26 09:18:38 +08:00
@zjsxwc 那不需要声明 a 变量
aguesuka
2021-10-26 09:24:28 +08:00
就是 4 楼的说法, 请相信这种简单的优化, 编译器比人更聪明.
bk201
2021-10-26 09:37:59 +08:00
语意应该浅显易懂,我觉得源码这处不行
cubecube
2021-10-26 09:38:23 +08:00
@aguesuka 然而有时候编译器并不会更聪明。
javac 近些年几乎保持不变。很多 jdk 的代码的确有部分优化,至于这种方式是否有神秘性能加成,回头可以分析下。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/810481

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX