小编典典

在生成 .equals() 时,有什么理由更喜欢 getClass() 而不是 instanceof?

all

我正在使用 Eclipse 生成.equals()and
.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。)有什么理由是个坏主意吗?


阅读 100

收藏
2022-07-27

共1个答案

小编典典

如果您使用instanceof,使您的equals实现final将保留该方法的对称契约:x.equals(y) == y.equals(x). 如果final看起来有限制,请仔细检查您的对象等价概念,以确保您的覆盖实现完全维护Object类建立的合同。


我想在这里说明的是,如果您认为这getClass()是保持对称性的唯一可靠方法,那么您可能使用equals()了错误的方法。

getClass()当然,保持
所需的对称性很容易使用equals(),但这只是因为x.equals(y)y.equals(x)总是错误的。Liskov
可替代性将鼓励您找到一种true在有意义时可以产生的保持对称性的实现。如果一个子类有一个完全不同的平等概念,它真的是一个子类吗?

2022-07-27