我正在出于教育目的研究 Java 值对象。
我不明白的是为什么没有人提到(同时)让 Java 值对象实现 Comparable?
如果出于平等原因,Java 值对象必须具有“正确的”HashCode 和 Equals,为什么它们不也必须具有 Comparable CompareTo 方法?
这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的 equals/hashcode。 值对象可以存储在“散列”集合中,这也是 Hashcode 方法所需要的。那么为什么不添加 Comparable 以便它们可以成为 Ordered 集合中的键呢?
最佳答案
我认为主要原因是,对于您指定的任何值对象,实际上只有一个相等的定义,而可以有多种方法来排序它的实例。平等的独特定义需要压倒一切equals()
(如果默认值不够。)完成此操作后,您需要提供匹配的 hashCode()
出于文档中引用的所有原因,实现。
但是,您不必实现 Comparable
来对值对象类的实例进行排序,实际上,如果您打算以多种方式对它们进行排序,那么您可能不应该这样做。简单地传递一个匿名内联Comparator
排序方法的实现就足够了,不同的比较器实现用于不同的排序。自 Java 8 和 lambda 以来,这比以往任何时候都容易。近年来,出于这个原因,我自己一直回避实现 Comparable
。
当然,如果您的特定值对象类确实存在自然排序,那么请务必实现Comparable
。在这种情况下,请确保它与您的 equals()
实现一致。
关于Java 值对象定义,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40060743/