我正在使用 Eclipse 生成.equals()and .hashCode(),并且有一个标记为“使用’instanceof’来比较类型”的选项。默认情况下未选中此选项并用于.getClass()比较类型。有什么理由我应该更喜欢.getClass()吗instanceof?
.equals()
.hashCode()
.getClass()
instanceof
不使用instanceof:
if (obj == null) return false; if (getClass() != obj.getClass()) return false;
使用instanceof:
if (obj == null) return false; if (!(obj instanceof MyClass)) return false;
我一般勾选instanceof选项,然后进去去掉“ if (obj == null)”勾选。(这是多余的,因为空对象总是会失败instanceof。)有什么理由是个坏主意吗?
if (obj == null)
如果您使用instanceof,使您的equals实现final将保留该方法的对称契约:x.equals(y) == y.equals(x). 如果final看起来有限制,请仔细检查您的对象等价概念,以确保您的覆盖实现完全维护Object类建立的合同。
equals
final
x.equals(y) == y.equals(x)
Object
我想在这里说明的是,如果您认为这getClass()是保持对称性的唯一可靠方法,那么您可能使用equals()了错误的方法。
getClass()
equals()
getClass()当然,保持 所需的对称性很容易使用equals(),但这只是因为x.equals(y)和y.equals(x)总是错误的。Liskov 可替代性将鼓励您找到一种true在有意义时可以产生的保持对称性的实现。如果一个子类有一个完全不同的平等概念,它真的是一个子类吗?
x.equals(y)
y.equals(x)
true