通过使它们抽象化来强制实施 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);
要么框架需要 hashCode
和 equals
在内部检查是否相等,那么实现应该在框架本身中完成,或者由用户决定是否覆盖这些方法。后一种情况无论如何都必须为 any Java class 做出此决定,因为它在 Object
中的实现方式以及身份和平等比较在 Java 和一般编程中表示。那么这样声明的目的是什么?
这听起来像是一种反模式,因为声明对于知道自己在做什么的程序员来说是不必要的,并引诱那些不知道的人用 super.equals/hashCode
覆盖它或创建他们不知道的实现'不需要也不想要。
你说过:
The latter case this decision has to be done for any Java class anyway...
确实需要这样做,但是如果没有这些声明,就不会强制 AbstractUnit
的子类的作者实际去做,因为 Object
上有默认实现。因此,该声明的目的是强制子类的作者根据其子类的需要实施 hashCode
和 equals
,而不是将它们排除在外。这至少消除了子类作者甚至没有考虑过需要这样做的常见错误原因。 (遗憾的是,它不能消除第二个常见的错误原因:作者这样做不正确。)
重新编辑:
This smells like an anti-pattern...
它是否是反模式是一个见仁见智的问题,因此与 SO 无关。
...because the declaration is unnecessary for programmers who know what they're doing...
许多作者不理解需要以兼容的方式覆盖equals
和hashCode
非常 行之有效。
...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
的子类,他们 需要实现 equals
和 hashCode
; AbstractUnit
的作者显然已经确定 A) 来自 Object
的版本将无法正确使用 AbtractUnit
的逻辑,并且 B) 他们无法提供合理的默认值。所以他们迫使子类作者以他们唯一的方式实现它们:通过声明它们 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);
要么框架需要 hashCode
和 equals
在内部检查是否相等,那么实现应该在框架本身中完成,或者由用户决定是否覆盖这些方法。后一种情况无论如何都必须为 any Java class 做出此决定,因为它在 Object
中的实现方式以及身份和平等比较在 Java 和一般编程中表示。那么这样声明的目的是什么?
这听起来像是一种反模式,因为声明对于知道自己在做什么的程序员来说是不必要的,并引诱那些不知道的人用 super.equals/hashCode
覆盖它或创建他们不知道的实现'不需要也不想要。
你说过:
The latter case this decision has to be done for any Java class anyway...
确实需要这样做,但是如果没有这些声明,就不会强制 AbstractUnit
的子类的作者实际去做,因为 Object
上有默认实现。因此,该声明的目的是强制子类的作者根据其子类的需要实施 hashCode
和 equals
,而不是将它们排除在外。这至少消除了子类作者甚至没有考虑过需要这样做的常见错误原因。 (遗憾的是,它不能消除第二个常见的错误原因:作者这样做不正确。)
重新编辑:
This smells like an anti-pattern...
它是否是反模式是一个见仁见智的问题,因此与 SO 无关。
...because the declaration is unnecessary for programmers who know what they're doing...
许多作者不理解需要以兼容的方式覆盖equals
和hashCode
非常 行之有效。
...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
的子类,他们 需要实现 equals
和 hashCode
; AbstractUnit
的作者显然已经确定 A) 来自 Object
的版本将无法正确使用 AbtractUnit
的逻辑,并且 B) 他们无法提供合理的默认值。所以他们迫使子类作者以他们唯一的方式实现它们:通过声明它们 abstract
.