繁体   English   中英

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

[英]Which is better way of having a null check?

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

给定一个字符串对象String str =“example”;

  1. If(str.someMethod() != null )
  2. 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") 。如果strnull你将得到一个NullPointerException。但是,如果你使用Yoad模式并写if ("constantString".equals(str))你会得到false因为ConstantString不等于null 。这当然只与比较相关,而不是说contains等。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM