最近有一个问题是,在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) {
...
}
}
答案 0 :(得分:19)
由于可读性问题,我更喜欢创建局部变量而不是总是进行转换。对我(或其他使用相同代码的开发人员)而言,代码可读性是一个重要问题。
担心这个阶段的表现让我觉得“过早优化”模式的例子。
答案 1 :(得分:12)
绝对是第一个。性能差异可能无关紧要,但可读性肯定会改进。
除了删除演员表之外,它还意味着你可以使用不同的名字 - 毕竟,你现在对这个变量了解得更多,所以给它一个更具体的名字可能是有意义的。情况并非总是如此,但也可能如此。 “为了命名一个值而引入局部变量”重构技术是一个被低估的,即使没有强制转换......
答案 2 :(得分:3)
我更喜欢第一个,因为它看起来更干净。第二个开始看起来像Lisp
。但这仅仅是个人意见。
答案 3 :(得分:3)
我说重要的是不要过早地优化。如果铸造有开销,那么它可能很小,以至于在实践中它实际上是不明显的。除非此代码段构成了应用程序CPU时间的大部分,否则我认为您不会发现两者之间存在任何可衡量的性能差异。
因此,我也会选择第一个选项,因为它看起来更干净,更容易理解和修改 - 比在99.99%的情况下更快地执行几个时钟周期更重要。
答案 4 :(得分:1)
绝对是个好主意,因为它可以提高清晰度。我会说这也适用于避免多个访问者调用 - 为了清晰而不是性能原因,这是一个好主意。
答案 5 :(得分:1)
我更喜欢第一种选择,原因有两个
答案 6 :(得分:0)
我更喜欢第一个,不仅仅是为了代码可读性,而是为了运行时调试(同样对于原始示例 - 如果将getter的结果放在本地,则可以看到该值,而不是必须跟踪到getter第一次)。
答案 7 :(得分:0)
我同意那些说第一个版本更可取的人,但我想补充一点,如果可能 - 而且几乎总是可行的 - 你应该首先避免施放。不是出于任何性能原因,而是为了对代码正确性进行额外检查。