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

时间:2009-09-17 11:05:57

标签: java casting

最近有一个问题是,在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) {
    ...
  }
}

8 个答案:

答案 0 :(得分:19)

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

担心这个阶段的表现让我觉得“过早优化”模式的例子。

答案 1 :(得分:12)

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

除了删除演员表之外,它还意味着你可以使用不同的名字 - 毕竟,你现在对这个变量了解得更多,所以给它一个更具体的名字可能是有意义的。情况并非总是如此,但也可能如此。 “为了命名一个值而引入局部变量”重构技术是一个被低估的,即使没有强制转换......

答案 2 :(得分:3)

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

答案 3 :(得分:3)

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

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

答案 4 :(得分:1)

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

答案 5 :(得分:1)

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

  1. 必要的括号使代码变得难以阅读
  2. 演员
  3. 可能有(小)开销

答案 6 :(得分:0)

我更喜欢第一个,不仅仅是为了代码可读性,而是为了运行时调试(同样对于原始示例 - 如果将getter的结果放在本地,则可以看到该值,而不是必须跟踪到getter第一次)。

答案 7 :(得分:0)

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