我有很多这些谎言,我想知道我是否会遇到任何麻烦 - 或性能问题。
我有方法A:
MyClass monkey;
...
if(monkey != null) {
...
}
或方法B:
boolean hasMonkey; //This is set to TRUE when monkey is not null
MyClass monkey;
...
if(hasMonkey) {
...
}
在功能层面,他们都做同样的事情。现在,我正在使用方法A.这是一种糟糕的做事方式吗?哪个会表现得更好?
答案 0 :(得分:19)
方法A是我所看到的“常见”案例。方法B引入了数据一致性问题(hasMonkey
什么不能正确设置?),而方法A只依赖于对象本身来确定其有效性。在我看来,方法A远非优越。
答案 1 :(得分:3)
方法A没问题 - 为什么要用不必要的变量来混淆代码?
答案 2 :(得分:3)
方法A更有意义,因为它将数据保存在一个位置,因此您不必担心在任何地方更新hasMonkey
。
答案 3 :(得分:3)
方法A,IMO没有任何问题。方法B有点违反DRY原则(我认为) - 设置和检查标志以指示monkey
引用是否为空是重复/冗余。
我认为这两种方法都没有任何性能影响,因为您在两种情况下都在测试条件。
答案 4 :(得分:2)
我会说使用第一种方法。
第二种方法的问题是您有冗余信息。您可能会遇到monkey
但hasMonkey
为假,或者可能更糟的情况:根据hasMonkey
您有一只猴子但是当您尝试访问某个成员时抛出一个NullPointerException
。第一种方法避免了这个潜在的问题。
答案 5 :(得分:2)
绝对是方法A.如果你想针对monkey
测试null
,那就去做吧。为什么要涉及额外的变量?谁跟踪总是正确设置它?更头痛,更容易出错,没有收获。
答案 6 :(得分:1)
一般来说,我会选择A - 更清晰,更简单,更一致。
但是,如果这是一个紧凑的循环,那么你可以尝试第二个,但总是配置文件。是否有性能提升取决于VM的智能程度。根据实现,如果底层硬件不能用于捕获无效指针访问,则VM可能必须在使用“monkey”引用之前检查空指针。在这种情况下,VM将始终检查引用,但它也可能足够聪明以确定引用是否为空 - 例如如果你有明确的检查。因此,使用A可能仍然是性能最佳的选项。
答案 7 :(得分:0)
方法A肯定更好,因为你不必额外增加另一个布尔值的开销,这将需要堆栈中的额外内存空间,并且根据你的描述,必须保持活动直到Monkey对象的范围。