Java 值对象定义

标签 java comparable value-objects

我正在出于教育目的研究 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/

相关文章:

java - JPA 带注释的对象与常规值对象一样

java - ArrayAdapter java.lang.NullPointerException

Java程序CopyFile将一个文件复制到另一个文件

java - Java 中的泛型

java - 实现java接口(interface)时保证 "Object o"参数是同一个泛型类型

c# - 如何使用 Entity Framework Core 3.0 创建所需的拥有类型

java - 实体可以通过其所有属性来识别吗?

找不到 Java 运行时环境错误

java - 测试post请求

Java - 如何将一对 3 整数插入优先级队列?