哪种方法是“正确的”(if语句)?

6

我有很多这样的东西放在那里,我想知道我是否会遇到任何麻烦或性能问题。

I have method A:


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

Or method B:


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

从功能层面来说,它们都做同样的事情。现在我正在使用方法A,这是一种不好的做法吗?哪种方法会表现更好?

8个回答

19

我观察到方法A是“常见”的情况。方法B引入了数据一致性的问题(hasMonkey是否得到正确设置?),而方法A仅依赖于对象本身来确定其有效性。在我看来,方法A要好得多。


谢谢,这正是我想听到的 :) - Richard Taylor
2
为了更清晰,您可以有一个方法boolean hasMonkey(),它返回monkey != null - ColinD

3

方法A是可以的 - 为什么要用不必要的变量来混淆代码呢?


3

方法A更加合理,因为它将数据保存在一个地方,这样您就不必担心在各个地方更新hasMonkey


3

在我看来,方法A没有任何问题。方法B有点违反DRY原则——设置并检查一个标志以指示monkey引用是否为空是一种重复/冗余。

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


2
我会说使用第一种方法。
第二种方法的问题在于它有冗余信息。可能会出现这样的情况:你有一个猴子,但是hasMonkey是假的,或者更糟糕的是:根据hasMonkey,你有一只猴子,但是当你试图访问成员时,它会抛出一个NullPointerException。第一种方法避免了这个潜在的问题。

2

绝对是方法A。如果你想测试monkey是否为null,就直接这样做。为什么要涉及额外的变量?谁来负责始终适当地设置它?更多的麻烦,更容易出错,没有任何收益。


1

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

但是,如果这是在一个紧密的循环中,那么你可以尝试第二个选项,但一定要进行性能分析。是否有性能提升取决于虚拟机的智能程度。根据实现方式,如果底层硬件不能用于捕获无效指针访问,虚拟机可能需要在使用“monkey”引用之前检查空指针。在这种情况下,虚拟机将始终检查引用,但它也可能足够聪明,以确定引用不为空 - 例如,如果您有一个显式的检查。因此,使用A仍然可能是最高效的选项。


0

方法A肯定更好,因为您不必再使用额外的布尔值来增加堆栈中的内存空间,并且根据您的描述,该值必须在Monkey对象的范围内保持活动状态。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接