当前位置: 首页 > 知识库问答 >
问题:

Java值对象定义

邵和硕
2023-03-14

出于教育目的,我正在研究Java值对象。

我不明白的是,为什么没有人(异口同声)提到Java值对象实现可比性?

如果Java值对象必须具有"正确的"HashCode

这是我的思考过程。将测试值对象的实例是否相等,因此它们需要正确的equals/hashcode。值对象可以存储在“hash”集合中,这也是Hashcode方法所需要的。那么,为什么不添加Compariable以便它们可以成为有序集合中的键呢?

共有1个答案

吴浩博
2023-03-14

我认为主要原因是,对于您指定的任何值对象,实际上只有一个相等的定义,而可以有多种方法来排序它的实例。相等的唯一定义需要重写equals()(如果默认值不够)完成此操作后,您需要提供匹配的hashCode()实现,原因与文档中引用的所有原因相同。

但是,您不必实现Comparable来对值对象类的实例进行排序,而且如果您打算以多种方式对它们进行排序,您可能不应该这样做。只需将匿名内联比较器实现传递给排序方法就足够了,不同的排序有不同的比较器实现。这比Java8和lambdas之后的任何时候都要容易。近几年来,正是出于这个原因,我本人一直回避实施compariable

当然,如果您的特定值对象类确实有一个自然的顺序,那么一定要实现Comparable。在这种情况下,请确保它与equals()实现一致。

 类似资料:
  • 特别是Java类不是我自己的(它是一个依赖项),所以我不能修改它。作者对类的想法是使用Builder模式构造对象,并且没有提供默认的构造函数。 为了避免这个问题,我想我需要创建一个适配器类。然后,我将通过使用序列化的适配器对象并填充构建器来构建我的对象。 有没有更干净的方法可以做到这一点?如果ObjectMapper提供了从流读取到特定对象的方法,我就可以使用生成器生成一个空对象,然后用Jacks

  • 我写了一个程序,创建了3个.txt格式的文件,并将一些数据写入其中。现在我被要求为这些文件定义一个value对象,并重写toString方法,然后当我读取这些文件时,将它们设置为value对象。现在我完全糊涂了,不知道从何说起。事先谢谢你的帮助

  • 问题内容: 我有一个用于存储项目的Java对象: 我使用一个列表来存储几个对象。如何将每个对象存储区中的总数汇总到列表中? 问题答案: 您可以利用Java 8 Stream API并实现如下所示的内容: 记住要为amount属性实现getter。

  • 如果发现未定义或为空,我想在数组中按下键 我想要像这样的输出 因为a1和平台的值为null且未定义 我已经尝试过这个解决方案,但它不起作用 但是这只返回['platform'],但是预期的输出应该是['platform','a1'],我认为在运行迭代器(obj[key])时,数组的值(blankValues)变为空,因为它不能保持它,但是请帮助我使用适当的逻辑和结构

  • } 我想从这个json对象中获取值。 我在下面试过了,但没有成功。

  • 我有一个具有20个属性的对象。 其中有些属性设置为值,有些未定义。当I!如何将未显示键值的设置为?