哪个是更好的空检查方法?

时间:2015-10-29 11:37:49

标签: java

我遇到了这两种对字符串对象进行空检查的方法。

给定一个字符串对象String str =" example&#34 ;;

  1. If(str.someMethod() != null )
  2. If (null != str.someMethod())
  3. 为什么我们更喜欢第二个? 这背后的确切原因是什么,它与性能有关吗?

2 个答案:

答案 0 :(得分:8)

在你的例子中,它与你做的完全没有区别(除了样式),因为Yoda检查的原因是为了避免意外地进行分配(但继续阅读为什么这在Java中无关紧要),以及你无法分配调用方法的结果。

Java的一个好处是,即使您正在测试str,例如:

if (str == null)

VS

if (null == str)

仍然没有区别,而在某些语言中,语法来自B(例如C,C ++,D,JavaScript等),人们会做第二个(“尤达测试“)以尽量减少这个错误的几率:

if (str = null)          // Not an issue in Java

例如,在C或JavaScript中, null分配给str,然后评估结果,将其强制转换为布尔值,而不是分支。但在Java中,这是编译器告诉你的语法错误。

Java没有进行那种布尔转换,所以在Java中使用Yoda检查的唯一原因是你是在测试布尔值,例如。

boolean flag;
// ...
if (flag == false)

,您可能会想到这样做:

if (flag = false)

但由于使用==!=完全没必要(您只需使用if (flag)if (!flag)),因此在现实世界中您不需要尤达用Java检查。

这并不意味着人们仍然不会使用它们,这是他们个人风格的问题。在Java中,没有客观的理由。

答案 1 :(得分:2)

在性能方面没有任何区别,但Yoda programming pattern在编程技能方面具有一些优势。

在你的例子中,因为两个案例都会抛出一个NullPointerException(因为你正在调用一个空实例引用的someMethod`),所以无所谓。

但是,请说您要检查str是否为空。在第一种情况下,您要写if (str == null),然后写第二if (null == str)。两者都是一样的。现在说你已经意外地使用了=而不是==。在Java中,没有关系,因为编译器不会让你因为表达式没有计算到布尔值。但是其他语言可以让你这样做,更具体地说是没有编译器的语言,只使用一个interperter。在这种情况下,如果您撰写if (str = null),您就会将null分配给字符串并覆盖其字符串{&1;}。当前值,这将导致错误的行为,你追逐你的尾巴很长一段时间。但是,如果您要撰写if (null = str),则会收到错误消息,指出您无法为null分配值,从而为您节省了大量的时间和精力。同样,这与JAVA无关。

可能与Java相关的一个示例是对常量值使用方法调用。例如,if (str.equals("constantString")。如果strnull,您将获得NullPointerException。但是,如果您使用Yoad模式并撰写if ("constantString".equals(str)),则falseConstantString null不等于contains。这当然只与比较相关,而不是说$(this).val()等。