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



Eclipse喜欢生成带有null检查的equals方法(对于没有超类的类),像这样:

if ( null == obj )
    return false;

然而,我喜欢

if ( obj == null )
    return false;

更多,因为它更具可读性。(这事总让我有点心烦。)

问:

为什么Eclipse在obj之前生成null,既然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;
    }
}

我认为我们需要对我们的pre-Kepler生成的equals方法进行一些清理。

有些人用null == obj代替obj == null,因为用=代替==没有风险,但这不会改变代码的工作方式。请记住,在Java中,只有当obj是Boolean时才有可能编写obj = null(没有错误)。这种编写代码的方式来自于其他编程语言,如C语言,在这些语言中,错误地编写obj = null是完全有效的。

您可以在Eclipse中修改生成equals方法的模板,参考以下链接

就两者之间的运行时差异而言,我认为这两个表达式应该是相同的,因为编译器会以类似的方式优化两个null检查表达式(即将生成相同的字节码)。更重要的是人们喜欢使用什么约定,这因人而异。

没有区别,Java中的约定(如果我们假设JDK是一个引用)是使用if (obj == null)。例如Objects#requireNonNull:

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

值得注意的是,Netbeans会自动生成equalsif (obj == null) return false;

无论您使用哪个,在运行时都不会产生差异,并且会生成相同的字节码。

还有一些人喜欢Master 尤达风格比较常量和变量

if (5 == i)——尤达风格

最新更新