通过使它们抽象化来强制实施 hashCode 和 equals 有什么好处吗?

Is there any advantage in enforcing implementation of hashCode and equals by making them abstract?

我偶然发现了 abstract AbstractUnit of the uom-se project 声明

// //////////////////////////////////////////////////////////////
// Ensures that sub-classes implements hashCode/equals method.
// //////////////////////////////////////////////////////////////

@Override
public abstract int hashCode();

@Override
public abstract boolean equals(Object that);

要么框架需要 hashCodeequals 在内部检查是否相等,那么实现应该在框架本身中完成,或者由用户决定是否覆盖这些方法。后一种情况无论如何都必须为 any Java class 做出此决定,因为它在 Object 中的实现方式以及身份和平等比较在 Java 和一般编程中表示。那么这样声明的目的是什么?

这听起来像是一种反模式,因为声明对于知道自己在做什么的程序员来说是不必要的,并引诱那些不知道的人用 super.equals/hashCode 覆盖它或创建他们不知道的实现'不需要也不想要。

你说过:

The latter case this decision has to be done for any Java class anyway...

确实需要这样做,但是如果没有这些声明,就不会强制 AbstractUnit 的子类的作者实际去做,因为 Object 上有默认实现。因此,该声明的目的是强制子类的作者根据其子类的需要实施 hashCodeequals,而不是将它们排除在外。这至少消除了子类作者甚至没有考虑过需要这样做的常见错误原因。 (遗憾的是,它不能消除第二个常见的错误原因:作者这样做不正确。)


重新编辑:

This smells like an anti-pattern...

它是否是反模式是一个见仁见智的问题,因此与 SO 无关。

...because the declaration is unnecessary for programmers who know what they're doing...

许多作者理解需要以兼容的方式覆盖equalshashCode非常 行之有效。

...and lures those who don't into overriding it with super.equals/hashCode

他们不能。 super 的版本是 abstract.

...or creating an implementation which they don't need or want.

显然,如果他们正在编写 AbstractUnit 的子类,他们 需要实现 equalshashCodeAbstractUnit 的作者显然已经确定 A) 来自 Object 的版本将无法正确使用 AbtractUnit 的逻辑,并且 B) 他们无法提供合理的默认值。所以他们迫使子类作者以他们唯一的方式实现它们:通过声明它们 abstract.