HashMap源码为何多用中间变量?
拿HashMap的keySet()方法举例:
public Set<K> keySet() {
Set<K> ks = keySet;
if (ks == null) {
ks = new KeySet();
keySet = ks;
}
return ks;
}
写成如下形式岂不是更简洁?
public Set<K> keySet() {
if(keySet == null) {
keySet = new KeySet();
}
return keySet;
}
public Set<K> keySet() {
return keySet == null ? (keyset = new KeySet()) : keySet;
}
作者有其他用意吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
可以勉强看做是作者的
变量就近定义
风格吧。把类成员变量或方法参数改为局部变量,在你这个小例子中可能显得有点多余,但这个习惯也有多个好处:1.更简洁清晰,局部变量可以使用缩写也很容易理解,成员变量没有人提倡用缩写;
2.可以按变量实际用途重新准确命名;
3.便于重构,如提取成方法等;
4.减少副作用,如意外修改成员变量等;
5.多几行代码单步调试时更容易观察变量;
6.更容易被优化.
个人见解,仅供参考。
http://hg.openjdk.java.net/jd...
你看的是什么年代的源码?jdk8的源码中就已经改成你写的那种形式了。
这个跟 keySet 被 volatile 修饰有关。
1 本地变量可以防止共享变量被意外修改。
2 使用本地变量可以减少对 volatile 变量的读取次数,JVM 可以优化代码的执行。
可以参考这个 https://stackoverflow.com/que...
如果不考虑 volatile,应该就是为了防止判过 keySet 空之后,别的线程把 keySet 设置成 null,结果返回了 null。