这是“正确”的方法(if语句)

时间:2010-06-03 18:24:50

标签: java android

我有很多这些谎言,我想知道我是否会遇到任何麻烦 - 或性能问题。

我有方法A:


MyClass monkey;
...
if(monkey != null) {
 ...
}

或方法B:


boolean hasMonkey; //This is set to TRUE when monkey is not null
MyClass monkey;
...
if(hasMonkey) {
 ...
}

在功能层面,他们都做同样的事情。现在,我正在使用方法A.这是一种糟糕的做事方式吗?哪个会表现得更好?

8 个答案:

答案 0 :(得分:19)

方法A是我所看到的“常见”案例。方法B引入了数据一致性问题(hasMonkey什么不能正确设置?),而方法A只依赖于对象本身来确定其有效性。在我看来,方法A远非优越。

答案 1 :(得分:3)

方法A没问题 - 为什么要用不必要的变量来混淆代码?

答案 2 :(得分:3)

方法A更有意义,因为它将数据保存在一个位置,因此您不必担心在任何地方更新hasMonkey

答案 3 :(得分:3)

方法A,IMO没有任何问题。方法B有点违反DRY原则(我认为) - 设置和检查标志以指示monkey引用是否为空是重复/冗余。

我认为这两种方法都没有任何性能影响,因为您在两种情况下都在测试条件。

答案 4 :(得分:2)

我会说使用第一种方法。

第二种方法的问题是您有冗余信息。您可能会遇到monkeyhasMonkey为假,或者可能更糟的情况:根据hasMonkey您有一只猴子但是当您尝试访问某个成员时抛出一个NullPointerException。第一种方法避免了这个潜在的问题。

答案 5 :(得分:2)

绝对是方法A.如果你想针对monkey测试null,那就去做吧。为什么要涉及额外的变量?谁跟踪总是正确设置它?更头痛,更容易出错,没有收获。

答案 6 :(得分:1)

一般来说,我会选择A - 更清晰,更简单,更一致。

但是,如果这是一个紧凑的循环,那么你可以尝试第二个,但总是配置文件。是否有性能提升取决于VM的智能程度。根据实现,如果底层硬件不能用于捕获无效指针访问,则VM可能必须在使用“monkey”引用之前检查空指针。在这种情况下,VM将始终检查引用,但它也可能足够聪明以确定引用是否为空 - 例如如果你有明确的检查。因此,使用A可能仍然是性能最佳的选项。

答案 7 :(得分:0)

方法A肯定更好,因为你不必额外增加另一个布尔值的开销,这将需要堆栈中的额外内存空间,并且根据你的描述,必须保持活动直到Monkey对象的范围。