2009-09-17 66 views
7

有最近询问是否是Java的一个好主意,分配调用一个getter一个局部变量,以避免同样的访问多个呼叫结果的问题。我无法找到最初的帖子,但一致认为这通常不是必须的,因为Hotspot无论如何都会优化掉方法调用开销。局部变量赋值,以避免重复蒙上

然而,什么是对采用这种技术来避免多次注塑看法?目前我面临之间的选择:

if (a instanceof Foo) { 
    // Cast once and assign to local variable. 
    Foo foo = (Foo)a; 

    if (foo.getB() == 1 && foo.getC() == 2) { 
    ... 
    } 
} 

OR

if (a instanceof Foo) { 
    // Cast twice making code compact but possibly less readable. 
    // Also, is there an overhead in multiple casts? 
    if (((Foo)a).getB() == 1 && ((Foo)a).getC() == 2) { 
    ... 
    } 
} 

回答

12

绝对要跟第一个一起去。性能差异很可能是无关紧要的,但可读性为,绝对是改进。

除了去除石膏,这也意味着你会使用不同的名字 - 毕竟,你现在知道更多关于这个变量,因此它很可能是有意义的给它一个更具体的名称。情况并非总是如此,但可以。 “为了命名一个值而引入局部变量”重构技术是一个未被重视的技术,即使没有演员表...

3

我更喜欢第一个,因为它看起来更干净。第二个开始看起来像Lisp。但这只是个人意见。

+0

Lisp有什么问题? – 2009-09-17 15:37:40

+2

没什么,我喜欢Lisp,它恰好有很多括号,就是这样。 – 2009-09-17 16:41:13

19

由于可读性问题,我更喜欢创建局部变量而不是总是投射。代码可读性对于我(或其他开发人员使用相同的代码)是一个重要的问题。

担心在这个阶段的表现给我的印象是“过早优化”模式的一个例子。

+0

谢谢 - 这实际上已经是我的首选方法;我只是想从程序员社区进行验证。 – Adamski 2009-09-17 11:17:12

1

绝对是一个好主意,因为它提高了清晰度。我会说这适用于避免多个访问者调用 - 这是清晰而不是性能原因的好主意。

3

我想说的重点不是过早优化。如果有铸造的开销,它可能会很小,以至于在实际中会显得不明显。除非这段代码构成了应用程序CPU时间的大部分,否则我认为你不会看到两者之间有明显的性能差异。

因此我还去了第一个选项,因为它看起来更干净,更容易理解和修改 - 远远超过更快的情况下,99.99%执行几个时钟周期的更重要。

1

我更喜欢第一种选择,原因有两个

  1. 必要的括号使代码cludgy,难以阅读
  2. 有可能是中投
0

我(小)开销更喜欢第一个,不仅仅是为了代码的可读性,而是为了运行时的调试(也是最初的例子 - 如果你把getter的结果放在本地,你会看到这个值,而不是第一次跟踪到getter) 。

0

我同意人们说的第一个版本是最好的,但我想补充一点,如果可能的话,它几乎总是有可能,你应该避免在首位铸造。不是出于任何性能的原因,而只是为了检查代码的正确性。