我正在研究用于教育目的的Java值对象。
我不明白的是为什么没有人提到(在同一呼吸)有Java值对象实现可比性?
如果Java值对象必须有"正确"的HashCode &等号因为相等原因为什么不需要有comparareto方法呢?
这是我的思考过程。值对象的实例将被测试是否相等,因此它们需要正确的equals/hashcode。值对象可以存储在"哈希"集合中,同样需要Hashcode方法。那么为什么不添加Comparable,让它们成为Ordered集合中的键呢?
我认为主要原因是对于您指定的任何值对象,实际上只有一个相等的定义,而可能有多种方法来排序它的实例。等式的唯一定义要求重写equals()
(如果默认值不够的话)。这样做之后,由于文档中提到的所有原因,您需要提供匹配的hashCode()
实现。
然而,你不必实现Comparable
来排序值对象类的实例,事实上,如果你打算以多种方式排序它们,你可能不应该这样做。只需将匿名内联Comparator
实现传递给排序方法就足够了,对于不同的排序使用不同的比较器实现。自从Java 8和lambda以来,这比以往任何时候都容易。近年来,我自己也因为这个原因而避免实现Comparable
。
当然,如果你的特定值对象类确实有一个自然的顺序,那么无论如何要实现Comparable
。在这种情况下,请确保它与您的equals()
实现一致。