我经常使用Eclipse代码生成工具(Source/Generate hashCode()和equals()...)为简单的POJO类创建equals()实现。如果我选择“使用instanceof比较类型”,这将产生一个类似于以下内容的equals()实现:
我经常使用Eclipse的代码生成工具 (Source / Generate hashCode() 和 equals() ...) 为简单的 POJO 类创建 equals() 实现。如果我选择 "Use instanceof to compare types",则会生成类似于以下的 equals() 实现:
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (!(obj instanceof MyClass)) {
return false;
}
MyClass other = (MyClass) obj;
// check the relevant fields for equality
}
今天一位同事指出,第二个if语句根本不必要,因为当obj为空时instanceof类型检查将返回false。(参见问题3328138)
现在,我想那些为Eclipse JDT编写代码模板的人也是很有价值的。所以我觉得肯定有某些原因使得null检查必要,但我不太确定是什么原因?
(此外,问题7570764可能会给出一些提示:如果我们使用getClass()比较来进行类型检查而不是使用instanceof,那么obj.getClass()就不安全了。也许代码模板只是不够聪明,不能在我们使用instanceof时省略null检查。)
编辑:Dragan在他的回答中注意到,instanceof类型检查不是Eclipse的默认设置,所以我已经将其从问题中删去。但这并没有改变什么。
请也不要建议我使用getClass()或(更好的是!)其他IDE。这不是重点,也不是回答问题。我没有问如何编写equals()实现,是否使用instanceof或getClass()等。
问题大致是:这是Eclipse中的一个小bug吗?如果不是,为什么它能够作为一个功能被认可?
if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; /*...*/
。 - Mick MnemonicgetClass()!= obj.getClass()
。 - Dakshinamurthy Karra.equals()
方法时,使用instanceof
还是getClass()
的问题在是否有理由在生成.equals()
方法时更喜欢使用getClass()
而不是instanceof
中得到了很好的解答。Josh Bloch更喜欢使用instanceof
,他的论点可以从这篇(旧的)采访中找到。 - Mick Mnemonic