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

是否需要重写记录的hashCode()和equals()?

栾越
2023-03-14

假设以下示例:

java prettyprint-override">public record SomeRecord(int foo, byte bar, long baz)
{ }

共有1个答案

唐景山
2023-03-14

是否需要它的答案实际上是--这取决于您决定创建为记录的实体的实现。在编译或运行时都没有限制来约束您这样做,而且扩展Object的类总是这样。

另一方面,该建议的主要动机之一是“低值、重复、容易出错的代码:构造函数、访问器、equals()hashcode()tostring()等”。在数据载体中,这在今天的Java编程中经常出现。因此,如前所述的决定是更倾向于语义目标

...:将数据建模为数据。(如果语义正确,样板文件将自行处理。)声明简单不变、行为良好的名义数据集合应该容易、清晰和简洁。

因此,样板已经得到了处理,但是请注意,出于某种原因,您可能仍然希望其中一个记录组件不被视为两个不同对象之间比较过程的一部分,这就是您可能希望重写提供的equalshashcode的默认实现的地方。此外,在我的想法中,toString有时是需要的,因此也需要重写它。

上面的大部分不能归类为编译或运行时失败,但建议本身就包含了随之而来的风险:

也可以显式声明从状态描述自动派生的任何成员。但是,不小心实现访问器或equals/hashcode可能会破坏记录的语义不变量。

(注意:后者主要是我的观点,消费者希望有各种灵活性,这样他们就可以使用最新的功能,但在某种程度上,现有的实现仍然有效。你知道,在升级期间,向后兼容性也在更大程度上很重要。)

 类似资料:
  • 我刚刚注意到javadoc状态(强调为我的): 返回声明中包含的此枚举常量的名称。该方法可能被重写,尽管它通常不是必需的或不需要的。当存在更“程序员友好”的字符串窗体时,枚举类型应重写此方法。 默认情况下,和返回相同的内容,因此即使被重写,仍然可以通过方法访问枚举的名称。 编辑:供参考,的javadoc(强调与原文相同): 返回此枚举常量的名称,与在其枚举声明中声明的名称完全相同。大多数程序员应该

  • 问题内容: 有没有办法找出一个类是否已重写和? 问题答案: 您可以使用反射 如果将注释掉,如果没有注释,将打印。 将返回实现该对象的类的对象。 请注意 ,仅适用于方法。但是,在这种情况下,和必须。取决于其他算法,该算法将需要更改。

  • 我知道(合同)当equals被重写时,我们需要重写hashcode。为什么我要考虑用于相等比较的相同字段来计算hashcode?是否通过避免太多对象映射到相同的桶来提高性能,如下面的情况?即所有在同一“日期”创建的对象都将映射到同一桶,并且线性比较将花费时间使用equals()方法检查对象是否存在? 如果我上面的说法是真的,那么除了性能问题之外,下面的代码还会出现哪些其他潜在的问题。这是我们应该使

  • (仅限类和接口,必需) (仅限类和接口,必需。请参见脚注1) (仅限方法和构造函数) (仅限方法) (是Javadoc 1.2中添加的同义词) (或或) (请参阅如何以及何时弃用API) 在这里,似乎被标记为“required”,即使不是这样。这在我看来很奇怪。事实上,后来在同一份文件中,我发现了以下陈述: 您可以提供一个@author标记、多个@author标记或不提供@author标记。

  • 本文向大家介绍请你解释为什么重写equals还要重写hashcode?相关面试题,主要包含被问及请你解释为什么重写equals还要重写hashcode?时的应答技巧和注意事项,需要的朋友参考一下 考点:java基础 HashMap中,如果要比较key是否相等,要同时使用这两个函数!因为自定义的类的hashcode()方法继承于Object类,其hashcode码为默认的内存地址,这样即便有相同含义

  • 问题内容: 我想知道是否有必要使用完。该标记的信息,这是一个样式表-所以就我而言,实际上并没有添加任何东西。 HTML唯一使用的样式表格式仍然是CSS,因此对浏览器“说”什么?某些网站似乎添加了属性,而其他网站则没有。 那么,什么是使用的元素,是有必要包括它? 问题答案: HTML5规范不是必需的,但对于旧版本的HTML是必需的。 HTML 4 W3.org规范 Type代表样式表的MIME类型。