object == null或null == object?

Jij*_*joy 94 java null

我听到某人null == objectobject == null 检查更好

例如:

void m1(Object obj ) {
   if(null == obj)  // Is this better than object == null ? Why ?
       return ;
   // Else blah blah
}
Run Code Online (Sandbox Code Playgroud)

有什么理由还是这是另一个神话?感谢帮助.

Lau*_*ves 135

这可能是从C学习的习惯,以避免这种拼写错误(单一=而不是双重==):

if (object = null) {
Run Code Online (Sandbox Code Playgroud)

将常量放在左侧的约定==在Java中并不真正有用,因为Java要求表达式if求值为一个boolean值,所以除非常量是a boolean,否则你会得到一个编译错误.参数.(如果它是一个布尔值,你不应该使用==...)

  • 除了特定的角落情况.http://stackoverflow.com/questions/2369226/null-check-in-java/2369249#2369249 (11认同)
  • 这对于java来说不是一个非常有用的习惯,因为拼写错误会导致java上的编译错误 (4认同)
  • @Chandru为布尔值,你可以使用`x.booleanValue()`或`!x.booleanValue()`.恕我直言,条件表达式中的`x == true`或`x == false`是一种难闻的气味. (3认同)
  • @Chandru好抓! (2认同)
  • 他在这里检查是否为null.并且在某些情况下,他确实必须检查null的布尔值,因为null既不是true也不是false. (2认同)

Jon*_*eet 31

正如其他人所说,这是从C中学到的习惯,以避免拼写错误 - 尽管即使在C中我也希望有足够警告级别的优秀编译器发出警告.正如Chandru所说,以这种方式与Java中的null进行比较只会导致问题,如果您使用的是类型变量Boolean(您不在示例代码中).我会说这是一种非常罕见的情况,而且不值得改变你在其他地方编写代码的方式.(即使在这种情况下,我也不会费心扭转操作数;如果我想清楚地考虑反转它们,我相信我可以算出等号.)

什么也没有被提及的是,很多人(当然我自己在内)发现的if (variable == constant)形式可读性更强-这是表达自己的更自然的方式.这是不要盲目地从C复制约定的原因.在假设在一个环境中可能有用的东西在另一个环境中有用之前,你应该总是质疑实践(就像你在这里做的那样:).

  • 我同意你所说的每一句话,特别是"盲目复制一份公约"的部分.我现在正在读代码,而null =对象样式让我非常烦恼,以至于我查了一下并来到这里.编码器的想法是什么? (3认同)

Cha*_*kar 27

除了对象的类型之外,这在Java(1.5+)中没有多大价值Boolean.在这种情况下,这仍然可以很方便.

if (object = null)如果是对象,则不会导致Java 1.5+中的编译失败,Boolean但会NullPointerException在运行时抛出.

  • 不,当object为Boolean时,它不会导致编译错误. (7认同)
  • 对于非布尔类型,代码将不会编译,因为表达式"object = null"的类型不是布尔值.由于自动装箱,它将编译为布尔值. (2认同)

R S*_*hko 9

在Java中没有充分的理由.

其他几个答案声称这是因为你可能会意外地将其分配而不是平等.但是在Java中,你必须在if中有一个布尔值,所以这个:

if (o = null)
Run Code Online (Sandbox Code Playgroud)

不会编译.

在Java中唯一可能重要的是变量是否为布尔值:

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality
Run Code Online (Sandbox Code Playgroud)

  • 写"== true"没有充分的理由.但是我在职业生涯中看到了很多不好的代码,我不再问为什么有人会写东西而只是接受有些人写了不必要/有问题的代码. (5认同)
  • 但是你为什么要写`== true`或同样`== true == true`. (3认同)

che*_*vim 7

这也与以下因素密切相关:

if ("foo".equals(bar)) {
Run Code Online (Sandbox Code Playgroud)

如果您不想处理NPE,这很方便:

if (bar!=null && bar.equals("foo")) {
Run Code Online (Sandbox Code Playgroud)


vav*_*ava 5

这个伎俩应该可以防止v = null一些错别字.

但Java只允许布尔表达式作为if()条件,因此技巧没有多大意义,编译器无论如何都会找到那些错别字.

尽管如此,它仍然是C/C++代码的宝贵技巧.