我正在使用 Eclipse 生成.equals()
and .hashCode()
,并且有一个选项标记为“使用'instanceof'来比较类型”。默认情况下不选中此选项并使用.getClass()
来比较类型。有什么理由让我更喜欢.getClass()
over instanceof
?
不使用instanceof
:
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Using instanceof
:
if (obj == null)
return false;
if (!(obj instanceof MyClass))
return false;
我通常会检查instanceof
选项,然后进去删除“if (obj == null)
“检查。(这是多余的,因为空对象总是会失败instanceof
.) 有什么理由认为这是一个坏主意吗?
乔什·布洛赫 http://www.artima.com/intv/bloch17.html赞成你的方法:
我赞成的理由是instanceof
方法是当你使用getClass
方法中,您有一个限制,即对象只能与同一类、同一运行时类型的其他对象相等。如果扩展一个类并向其添加一些无害的方法,然后检查子类的某个对象是否等于超类的对象,即使这些对象在所有重要方面都相同,您也会得到令人惊讶的答案是它们不相等。事实上,这违反了严格的解释里氏替换原则,并可能导致非常令人惊讶的行为。在Java中,它尤其重要,因为大多数集合(HashTable
等)基于 equals 方法。如果您将超类的成员作为键放入哈希表中,然后使用子类实例查找它,您将找不到它,因为它们不相等。
也可以看看这个答案 https://stackoverflow.com/questions/27581/overriding-equals-and-hashcode-in-java/32223#32223.
有效的Java第3章 http://java.sun.com/developer/Books/effectivejava/Chapter3.pdf也涵盖了这一点。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)