Eclipse生成equals方法:if(obj == null) vs. if(null == obj)。

4
Eclipse喜欢为没有超类的类生成具有null检查的equals方法,就像这样:
if ( null == obj )
    return false;

然而,我喜欢。
if ( obj == null )
    return false;

更易读,因为它更加可读性强。(这总是让我感到不安。)
问题:
为什么Eclipse生成的代码中,null出现在obj之前?因为if ( null == obj )是一种过时的做法,源自C/C++,如此描述:(obj == null) vs (null == obj)? 这两种方式之间是否有(运行时)差异?我只能猜测...
更新:
Eclipse Kepler似乎生成if ( obj == null ),因此这仅适用于早期版本的Eclipse。
类之前:
public class Burp
{
    private Long id ;

    public Burp()
    {
        // test
    }
}

课后:
public class Burp
{
    private Long id ;

    public Burp()
    {
        // test
    }

    // hashCode() omitted

    @Override
    public boolean equals( Object obj )
    {
        if ( this == obj )
            return true;
        if ( obj == null )
            return false;
        if ( getClass() != obj.getClass() )
            return false;
        Burp other = ( Burp ) obj;
        if ( this.id == null )
        {
            if ( other.id != null )
                return false;
        }
        else if ( !this.id.equals( other.id ) )
            return false;
        return true;
    }
}

我认为我们需要清理一下我们在Kepler之前生成的equals方法。

1
在Eclipse和任何正确的Java编译器中,if ( obj = null )会产生一个错误。 - Kawu
1
你可能会得到这样的答案:“必须有一种方式,而你认为更易读的并不一定是每个人都认为更易读的”。 - Richard Tingle
4个回答

4
有些人会写成null == obj而不是obj == null,因为使用=而非==没有风险,但这并不会改变你的代码运行方式。请记住,在Java中只有当obj是Boolean类型时才能写成obj = null(而且不会出错)。这种编码方式来自于其他编程语言(如C),在那里写成obj = null是完全有效的,但在Java中却不是。

@assylias 您是正确的,它不能被称为约定俗成的做法,我已经将其删除了。有些人只是认为这是一个好习惯。 - Jakub H
2
在Eclipse和任何正确的Java编译器中,if ( obj = null )会产生一个错误。 - Kawu
1
类型为 if ( obj = null ) 的参数并不危险,因为 Java 编译器(Eclipse)会捕获它,参见我在你上面的评论。 - Kawu
1
是的,但是你是否为Boolean类生成了equals方法? - Kawu
1
我只是在说一般情况下Java是可以实现的,以及为什么人们使用它。在equals方法的情况下,不可能犯这样的错误,因此生成了null == obj,因为该模板的作者可能在每个类和方法中都以这种方式编写代码。这种写作风格除了可读性之外没有任何其他缺点,但我更喜欢写obj == null。 - Jakub H
显示剩余5条评论

3
您可以通过修改Eclipse中生成equals方法的模板来实现,参考以下链接:链接 就运行时差异而言,我认为两者表达式应该相同,因为编译器将以类似的方式优化两个null检查表达式(即将生成相同的字节码)。这更多地涉及人们喜欢使用哪种约定,这因人而异。

2

在Java中,如果我们假设JDK为参考,那么没有区别,惯例是使用if (obj == null)。例如,请参阅Objects#requireNonNull的代码:

public static <T> T requireNonNull(T obj) {
    if (obj == null)
        throw new NullPointerException();
    return obj;
}

就我所知,Netbeans会自动生成带有 if (obj == null) return false;equals方法。

使用哪个方法在运行时不会有任何区别,并且会生成相同的字节码。


1

还有一些人喜欢使用Master Yoda风格,其中你会将常量与变量进行比较

if (5 == i) -- Yoda风格


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接