我正在研究出于教育目的的Java Value Objects。

我不明白的是为什么没有人(同时)提到让Java Value Objects实现Comparable?

如果出于相等的原因,Java值对象必须具有“正确的” HashCode和Equals,那么为什么不还必须具有Comparable CompareTo方法?

这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的等于/哈希码。
值对象可以存储在“哈希”集合中,同样需要Hashcode方法。那么,为什么不添加Comparable以便它们成为Ordered集合中的键呢?

最佳答案

我认为主要原因是,对于您指定的任何值对象,确实只有一个和唯一的相等定义,而可能有多种方式对它的实例进行排序。唯一性的相等性定义必须覆盖equals()(如果默认值不满足要求)。一旦这样做,出于文档中引用的所有原因,您需要提供匹配的hashCode()实现。

但是,您不必实现Comparable即可对值对象类的实例进行排序,并且实际上,如果打算以多种方式对它们进行排序,则可能不应该这样做。只需将匿名内联Comparator实现传递给sort方法就足够了,对于不同的顺序,可以使用不同的比较器实现。自Java 8和lambda以来,这比以往任何时候都容易。出于这个原因,近年来,我本人不愿执行Comparable

当然,如果您的特定值对象类确实存在自然排序,则必须实施Comparable。在这种情况下,请确保它与您的equals()实现一致。

关于java - Java值对象定义,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/40060743/

10-10 16:06