我遇到了这两种对字符串对象进行空检查的方法。
给定一个字符串对象String str =" example&#34 ;;
If(str.someMethod() != null )
或If (null != str.someMethod())
为什么我们更喜欢第二个? 这背后的确切原因是什么,它与性能有关吗?
答案 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")
。如果str
为null
,您将获得NullPointerException。但是,如果您使用Yoad模式并撰写if ("constantString".equals(str))
,则false
会ConstantString
null
不等于contains
。这当然只与比较相关,而不是说$(this).val()
等。