局部变量赋值以避免多次转换

最近有一个问题是,在Java中将调用getter的结果分配给局部变量以避免多次调用同一个访问器是一个好主意。 我找不到原始post,但似乎一致认为这通常不是必要的,因为Hotspot无论如何都会优化掉方法调用开销。

但是,采用这种技术避免多次演员的观点是什么? 目前,我面临着以下选择:

if (a instanceof Foo) { // Cast once and assign to local variable. Foo foo = (Foo)a; if (foo.getB() == 1 && foo.getC() == 2) { ... } } 

要么

 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) { ... } } 

绝对是第一个。 性能差异可能无关紧要,但可读性肯定会提高。

除了删除强制转换之外,它还意味着您可以使用不同的名称 – 毕竟,您现在已经了解了有关此变量的更多信息,因此为其提供更具体的名称可能更有意义。 情况并非总是如此,但也可能如此。 “为了命名一个值而引入局部变量”重构技术是一个被低估的,即使没有演员…

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

在这个阶段担心性能让我感到震惊,作为“过早优化”模式的一个例子。

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

我要说重要的是不要过早优化。 如果铸造有开销,那么它可能很小,以至于在实践中它实际上是不明显的。 除非此代码段形成了应用程序CPU时间的大部分,否则我认为您不会发现两者之间存在任何可衡量的性能差异。

因此,我也会选择第一个选项,因为它看起来更干净,更容易理解和修改 – 比在99.99%的情况下更快地执行几个时钟周期更重要。

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

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

  1. 必要的parantheses使代码变得笨拙并且难以阅读
  2. 演员表可能有(小)开销

我更喜欢第一个,不仅仅是为了代码可读性,而是为了运行时调试(也适用于原始示例 – 如果你将getter的结果放在本地,你会看到这个值而不是第一次跟踪到getter )。

我同意那些说第一个版本更可取的人,但我想补充一点,如果可能 – 而且几乎总是可行的 – 你应该首先避免施放。 不是出于任何性能原因,而是为了额外检查代码的正确性。