java - object == null或null == object?

我从某人那里听说null == object优于object == null 检查

例如:

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

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

Jijoy asked 2019-08-13T11:55:04Z
10个解决方案
131 votes

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

if (object = null) {

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

Laurence Gonsalves answered 2019-08-13T11:55:29Z
31 votes

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

没有提到的是许多人(我自己肯定包括在内)发现if (variable == constant)表格更具可读性 - 这是表达自己的一种更自然的方式。 这是不要盲目地从C复制约定的原因。在假设在一个环境中可能有用的东西在另一个环境中有用之前,你应该总是质疑实践(正如你在这里做的那样:)。

Jon Skeet answered 2019-08-13T11:56:06Z
26 votes

这在Java(1.5+)中没有多大价值,除非对象的类型是if (object = null).在这种情况下,这仍然很方便。

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

Chandra Sekar S answered 2019-08-13T11:56:43Z
9 votes

在Java中没有充分的理由。

其他几个答案声称它是因为你不小心让它分配而不是平等。 但是在Java中,你必须在if中有一个布尔值,所以这个:

if (o = null)

不会编译。

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

int m1(boolean x)
{
    if (x = true)  // oops, assignment instead of equality
R Samuel Klatchko answered 2019-08-13T11:57:37Z
6 votes

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

if ("foo".equals(bar)) {

如果你不想与NPE打交道,这很方便:

if (bar!=null && bar.equals("foo")) {
cherouvim answered 2019-08-13T11:58:14Z
5 votes

这个伎俩应该可以防止if()这种错别字。

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

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

vava answered 2019-08-13T11:59:00Z
3 votes

出于同样的原因,你在C中做到了; 赋值是一个表达式,因此您将文字放在左侧,以便在不小心使用=而不是==时不能覆盖它。

Ignacio Vazquez-Abrams answered 2019-08-13T11:59:33Z
3 votes

那是那些喜欢在左侧保持常数的人。在大多数情况下,在左侧使用常量将阻止抛出NullPointerException(或具有另一个nullcheck)。 例如,String方法equals也是一个空检查。 左边的常量将阻止你编写额外的支票。 其他方式也在以后执行。 左边的空值只是一致的。

喜欢:

 String b = null;
 "constant".equals(b);  // result to false
 b.equals("constant");  // NullPointerException
 b != null && b.equals("constant");  // result to false
SPee answered 2019-08-13T12:00:04Z
2 votes

与以下代码比较:

    String pingResult = "asd";
    long s = System.nanoTime ( );
    if ( null != pingResult )
    {
        System.out.println ( "null != pingResult" );
    }
    long e = System.nanoTime ( );
    System.out.println ( e - s );

    long s1 = System.nanoTime ( );
    if ( pingResult != null )
    {
        System.out.println ( "pingResult != null" );
    }
    long e1 = System.nanoTime ( );
    System.out.println ( e1 - s1 );

输出(多次执行后):

null != pingResult
325737
pingResult != null
47027

因此,pingResult != null是赢家。

Avinash answered 2019-08-13T12:00:49Z
1 votes

由于其可交换属性,null == objectnull == object(Yoda版本)之间的唯一区别是认知性质:读者如何读取和消化代码。 我不知道确切的答案,但我知道我个人更喜欢将我检查的对象与其他东西进行比较,而不是将其他东西与我正在检查的对象进行比较,如果这样做的话 任何意义。 从主题开始,然后将值与其进行比较。

在其他一些语言中,这种比较风格更有用。

为了安全防范失踪" =" 虽然签到一般,但我认为写作null == object是一种被误导的防御性编程行为。 围绕这个特定代码的更好方法是通过junit测试来保证行为。 请记住,错过" =" 不依赖于方法的输入参数 - 您不依赖于其他人正确使用此API - 因此junit测试非常适合安全防范。 无论如何,你会想要编写junit测试来验证行为; 缺少" =" 自然属于范围。

Benny Bottema answered 2019-08-13T12:01:36Z
translate from https://stackoverflow.com:/questions/2369226/object-null-or-null-object