我正在使用 Eclipse 生成 .equals()
和 .hashCode()
,并且有一个标记为“使用’instanceof’来比较类型”的选项。默认情况下未选中此选项并使用 .getClass()
比较类型。有什么理由我更喜欢 .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
。)有什么理由是个坏主意吗?
原文由 Kip 发布,翻译遵循 CC BY-SA 4.0 许可协议
如果您使用
instanceof
,则使您的equals
实现final
将保留方法的对称合约:x.equals(y) == y.equals(x)
如果final
似乎具有限制性,请仔细检查您的对象等效概念,以确保您的覆盖实现完全维护由Object
类建立的合同。我想在这里说明的是,如果您认为
getClass()
是保持对称性的唯一可靠方法,那么您可能使用的是equals()
错误的方法。Sure, it’s easy to use
getClass()
to preserve the symmetry required ofequals()
, but only becausex.equals(y)
andy.equals(x)
are always false. Liskov 可替换性将鼓励您找到一个保持对称的实现,它可以在有意义的时候产生true
。如果一个子类有一个完全不同的平等概念,它真的是一个子类吗?