Eclipse等于生成:null检查缺失?

时间:2011-09-27 14:25:07

标签: java eclipse

我让Eclipse为我的类生成equals方法,它以:

开头
@Override
public boolean equals(Object obj) {
    if (this == obj)
        return true;
    if (getClass() != obj.getClass())
        return false;
[...]

在我看来,缺少if (obj == null) return false;之类的支票。否则,如果将null引用传递给equals,则obj.getClass()中将出现空指针异常。我错了还是Eclipse错了?

6 个答案:

答案 0 :(得分:4)

也许你正在使用旧的eclipse版本。我的日食产生了这个:

if (this == obj)
    return true;
if (obj == null)
    return false;
if (getClass() != obj.getClass())
    return false;

答案 1 :(得分:2)

你是对的,如果Eclipse这样做的话。但事实并非如此。在我的机器上,Eclipse Indigo / Ubuntu,给出了这个类:

public class Foo {
    private String bar;
}

Eclipse将生成以下equals()方法:

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

为了比较,这里是我为同一个类写的equals()方法(使用Guava):

@Override
public boolean equals(final Object obj) {
    return obj instanceof Foo ? Objects.equal(bar, ((Foo) obj).bar) : false;
    //          ^--- implicit null check here
}

我使用这个Eclipse代码模板来实现这个目标:

${:import(com.google.common.base.Objects)}
@Override
public boolean equals(final Object obj){
    return obj instanceof ${enclosing_type} ? Objects.equal(${field1:field}, ((${enclosing_type}) obj).${field1}) : false;
}

@Override
public int hashCode(){
    return Objects.hashCode(${field1});
}

@Override
public String toString(){
    return MoreObjects.toStringHelper(this).add("${field1}", ${field1}).toString();
}

不幸的是,我必须为每个字段的基数保留其中一个,所以我有名为eq1(上面),eq2,eq3,eq4等的模板。这是一个小小的文化,但它仍然比Eclipse生成的怪物方法。 Guava docs

答案 2 :(得分:0)

是的,将null作为obj传递将为NullPointerException提供该代码。

答案 3 :(得分:0)

你确实需要空检查。我的Eclipse版本使用null检查生成equals方法。

答案 4 :(得分:0)

如果(obj)为null,则obj.getClass()将抛出NPE

答案 5 :(得分:0)

  

在我看来,像if(obj == false)这样的检查会返回false;不见了。

为什么要将对象与布尔值进行比较? ; - )

我想你关于obj == null check,这正是Eclipse在我的情况下生成的:

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

我使用的是3.7版本。无论如何,你是对的......实际上是Eclipse ......也是;)