【问题标题】:Eclipse generating equals method: if ( obj == null ) vs. if ( null == obj )Eclipse 生成 equals 方法: if ( obj == null ) vs. if ( null == obj )
【发布时间】:2014-05-14 14:04:36
【问题描述】:

Eclipse 喜欢使用 nullcheck 生成 equals 方法(对于没有超类的类),如下所示:

if ( null == obj )
    return false;

不过,我喜欢

if ( obj == null )
    return false;

更多,因为它更具可读性。 (这一直困扰着我。)

问:

考虑到if ( null == obj ) 是此处所述源自 C/C++ 的过时做法,为什么 Eclipse 会在 obj 之前生成 null?:

(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 方法。

【问题讨论】:

  • if ( obj = null ) 在 Eclipse 和任何正确的 Java 编译器中产生错误。
  • 您最终可能会得到答案“它必须是单向的,您认为更具可读性的内容不一定是每个人都认为更具可读性的内容”

标签: java eclipse code-generation equals


【解决方案1】:

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

【讨论】:

  • 如果 Eclipse 生成这种代码,为什么要“打字”作为参数?
  • if ( obj = null ) 在 Eclipse 和任何正确的 Java 编译器中产生错误。
  • if ( obj = null ) 类型的参数没有危险,因为 Java 编译器 (Eclipse) 会捕获它,请参阅我上面的评论。
  • 是的,但是您是否为Boolean 类生成equals 方法?
  • 我只是说它在 Java 中是可能的,以及人们使用它的原因。在equals方法的情况下不可能犯这样的错误,所以生成了null == obj,因为这个模板的作者可能每次在每个类和方法中都这样编写他的代码。这种写法除了可读性之外没有其他缺点,但我更喜欢写obj == null。
【解决方案2】:

你可以修改Eclipse中生成equals方法的模板,参考以下link

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

【讨论】:

    【解决方案3】:

    没有区别,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;

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

    【讨论】:

      【解决方案4】:

      还有一些人喜欢 Master Yoda 风格,您可以在其中比较常量和变量

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

      【讨论】:

        猜你喜欢
        • 2019-10-07
        • 2023-04-02
        • 1970-01-01
        • 2011-12-27
        • 1970-01-01
        • 2011-12-24
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多