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;
    }

作者有其他用意吗?

阅读 3.1k
3 个回答

这个跟 keySet 被 volatile 修饰有关。

1 本地变量可以防止共享变量被意外修改。
2 使用本地变量可以减少对 volatile 变量的读取次数,JVM 可以优化代码的执行。

可以参考这个 https://stackoverflow.com/que...

如果不考虑 volatile,应该就是为了防止判过 keySet 空之后,别的线程把 keySet 设置成 null,结果返回了 null。

可以勉强看做是作者的变量就近定义风格吧。把类成员变量或方法参数改为局部变量,在你这个小例子中可能显得有点多余,但这个习惯也有多个好处:

1.更简洁清晰,局部变量可以使用缩写也很容易理解,成员变量没有人提倡用缩写;
2.可以按变量实际用途重新准确命名;
3.便于重构,如提取成方法等;
4.减少副作用,如意外修改成员变量等;
5.多几行代码单步调试时更容易观察变量;
6.更容易被优化.

个人见解,仅供参考。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题