gpt4 book ai didi

java - 通过抽象来强制执行 hashCode 和 equals 是否有任何优势?

转载 作者:行者123 更新时间:2023-11-30 06:08:22 25 4
gpt4 key购买 nike

我刚刚偶然发现 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在内部检查相等性,然后应该在框架本身中完成实现,或者由用户决定是否覆盖这些方法。在后一种情况下,由于 Object 中的实现方式,任何 Java 类都必须做出此决定。以及恒等比较和相等比较在 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 的子类,他们确实需要实现 equalshashCode; AbstractUnit 的作者显然已经确定 A) 来自 Object 的版本将无法与 AbtractUnit 的逻辑正常工作,并且 B) 他们可以不提供合理的默认值。因此,他们迫使子类作者以唯一的方式来实现它们:通过声明它们abstract

关于java - 通过抽象来强制执行 hashCode 和 equals 是否有任何优势?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50784241/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com