[英]Which is better way of having a null check?
我遇到了这两种对字符串对象进行空检查的方法。
给定一个字符串对象String str =“example”;
If(str.someMethod() != null )
或 If (null != str.someMethod())
为什么我们更喜欢第二个? 这背后的确切原因是什么,它与性能有关吗?
在你的例子中,它与你做的完全没有区别(除了样式),因为Yoda检查的原因是为了避免意外地进行任务(但是继续阅读为什么这在Java中无关紧要),你可以' t分配调用方法的结果。
关于Java的一个好处是,即使您正在测试str
,例如:
if (str == null)
与
if (null == str)
仍然没有区别,而在某些语言中使用B语言(例如C,C ++,D,JavaScript等),人们会做第二次(“尤达测试”)以最小化这种情况BUG:
if (str = null) // Not an issue in Java
例如,在C或JavaScript中,将为str
分配 null
,然后计算结果,将其强制转换为boolean,而不是分支。 但在Java中,这是编译器告诉你的语法错误。
Java没有进行那种布尔转换,所以在Java中使用Yoda检查的唯一原因是你是在测试布尔值,ec
boolean flag;
// ...
if (flag == false)
在那里 ,你可能会想到这是偶然的:
if (flag = false)
但是因为使用带有布尔值的==
和!=
是完全没必要的(你只需使用if (flag)
或if (!flag)
),在现实世界中你根本不需要用Java进行Yoda检查。
这并不意味着人们仍然不会使用它们,这是他们个人风格的问题。 在Java中,没有客观的理由。
它在性能方面没有任何区别,但是当谈到编程技能的世界时, Yoda编程模式有一些优势。
在您的示例中,这两个案例都会抛出NullPointerException
(因为您正在调用null实例引用的someMethod`)并不重要。
但是,假设您要检查str
是否为null。 在第一种情况下,您将编写if (str == null)
并在第二种if (null == str)
编写。 两者都是一样的。 现在说你意外地使用=
而不是==
。 在Java中,没关系,因为编译器不会让你因为表达式没有评估布尔值。 但是其他语言可以让你这样做,更具体地说是没有编译器的语言,只使用一个interperter。 在这种情况下,如果您编写if (str = null)
您将为字符串赋值null
并覆盖其当前值,这将导致错误的行为并且您在尾巴上追逐很长一段时间。 但是,如果您编写if (null = str)
,则会收到错误消息,指出您无法将值分配给null
,从而节省了大量的时间和精力。 同样,这与JAVA无关。
可能与Java相关的示例是对常量值使用方法调用。 例如, if (str.equals("constantString")
。如果str
为null
你将得到一个NullPointerException。但是,如果你使用Yoad模式并写if ("constantString".equals(str))
你会得到false
因为ConstantString
不等于null
。这当然只与比较相关,而不是说contains
等。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.