【问题标题】:Java coding style on create new local variable to refer to class member variablesJava 编码风格创建新的局部变量来引用类成员变量
【发布时间】:2020-01-25 05:11:14
【问题描述】:

这是一个关于哪种风格更通用或更优雅的一般编码风格问题。

在阅读 Java 集合源代码时,我发现第一种样式比第二种样式更频繁。任何人都可以对此进行一些解释/推理吗?恕我直言,第二种风格比第一种更简洁,但实际上,第一种风格应该以某种方式更优雅,我无法争辩。

  1. 创建局部变量。
private Set<K> keySet;

public Set<K> keySet() {
    Set<K> ks = keySet;
    if (ks == null) {
        ks = new KeySet();
        keySet = ks;
    }
    return ks;
}

  1. 对类成员变量进行操作。
public Set<K> keySet() {
    if (keySet == null) {
        keySet = new KeySet();
    }
    return keySet;
}

【问题讨论】:

  • 你在看哪个版本的源代码?我只能找到return (ks = keySet) == null ? (keySet = new KeySet()) : ks;。没有第二次分配给ks
  • 源代码的版本无关紧要。对于你提到的源代码,为什么不写成:if(keySet == null) keySet = new KeySet(); return keySet;
  • @lucas 源代码的版本确实如果你不能产生一个实际上包含你声称它包含的源代码的版本。

标签: java android coding-style


【解决方案1】:

这是micro-optimizing延迟初始化的尝试。

由于经常使用集合类,包括在需要高吞吐量的情况下,目标是尽可能节省时间。


这里尝试的优化是减少getfield 操作的数量。

由于该集合只初始化一次,我们担心初始化之后的性能。

第一个代码块通过确保对 null 的检查是本地的,从而避免了 getfield初始化集合后,第一个代码块将总是导致一个getfield调用,而第二个代码块将总是结果在两个getfield 电话中。

【讨论】:

  • 好点,我想这就是我正在寻找的答案。万分感谢。 @Vince Emigh > JIT 可能会对此进行优化。例如,不要指望在 Dalvik 上进行这种优化。出于其他原因,将字段拉入本地可能很有用,例如对可以同时访问的字段进行空检查。 – NateS 2012 年 11 月 22 日 3:07
猜你喜欢
  • 1970-01-01
  • 2015-10-21
  • 1970-01-01
  • 1970-01-01
  • 2014-12-22
  • 2023-03-20
  • 1970-01-01
  • 1970-01-01
  • 2013-04-06
相关资源
最近更新 更多