Java 值对象定义
Java Value Object Definition
我正在研究 Java 用于教育目的的值对象。
我不明白的是为什么没有人(同时)提到 Java 值对象实现 Comparable?
如果 Java 值对象必须有 "correct" HashCode & Equals 出于平等的原因,为什么他们不也必须有 Comparable CompareTo 方法?
这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的 equals/hashcode。
值对象可以存储在 "hash" 集合中,同样需要 Hashcode 方法。那么为什么不添加 Comparable 以便它们可以成为 Ordered 集合中的键?
我认为主要原因是对于您指定的任何值对象,实际上只有一个相等性定义,而可以有多种方式来排序它的实例。由于文档中引用的所有原因,平等的独特定义需要覆盖 equals()
(if the default does not suffice.) Once you do that, you need to provide the matching hashCode()
实现。
但是,您不必实施 Comparable
to order instances of a value object class, and indeed you probably shouldn't if you intend to order them multiple ways. Simply passing an anonymous inline Comparator
对排序方法的实施就足够了,不同的比较器实施用于不同的排序。自 Java 8 和 lambda 以来,这比以往任何时候都容易。近年来,出于这个原因,我本人一直回避实施 Comparable
。
当然,如果您的特定值对象确实存在自然排序 class,那么一定要实现 Comparable
。在这种情况下,请确保它与您的 equals()
实施一致。
我正在研究 Java 用于教育目的的值对象。
我不明白的是为什么没有人(同时)提到 Java 值对象实现 Comparable?
如果 Java 值对象必须有 "correct" HashCode & Equals 出于平等的原因,为什么他们不也必须有 Comparable CompareTo 方法?
这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的 equals/hashcode。 值对象可以存储在 "hash" 集合中,同样需要 Hashcode 方法。那么为什么不添加 Comparable 以便它们可以成为 Ordered 集合中的键?
我认为主要原因是对于您指定的任何值对象,实际上只有一个相等性定义,而可以有多种方式来排序它的实例。由于文档中引用的所有原因,平等的独特定义需要覆盖 equals()
(if the default does not suffice.) Once you do that, you need to provide the matching hashCode()
实现。
但是,您不必实施 Comparable
to order instances of a value object class, and indeed you probably shouldn't if you intend to order them multiple ways. Simply passing an anonymous inline Comparator
对排序方法的实施就足够了,不同的比较器实施用于不同的排序。自 Java 8 和 lambda 以来,这比以往任何时候都容易。近年来,出于这个原因,我本人一直回避实施 Comparable
。
当然,如果您的特定值对象确实存在自然排序 class,那么一定要实现 Comparable
。在这种情况下,请确保它与您的 equals()
实施一致。