我让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错了?
答案 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 ......也是;)