为什么 java 决定根据记录的类型检查记录之间的相等性?

问题描述 投票:0回答:1

我读过关于java中的

record
(在JDK 14中引入)。
我喜欢值对象的概念(因为很多 Java 专家很久以前就讨论过这个概念)。
我想知道如何通过类型+值来断言 2 条记录相等。

他们为什么引入

type
断言?
我的直觉告诉我,如果 2 个记录具有相同的值,它们应该相等,因为根据定义,这些值是最终的,并且没有任何行为引入这些记录。

java record
1个回答
0
投票

这是值类型的合理默认实现。

如果您想要不同的行为,仍然可以覆盖

hashCode()
equals()

忽略类型会更难确保 equals 的对称性和传递性要求。这并不特定于记录。

Object.equals()
的默认实现更加严格,要求引用相等。为了定义值类型实例的相等性,比较值就足够了。

比较不同类型的实例,其中只有一种类型覆盖 equals 而另一种类型不覆盖 equals ,这是错误的,因为它几乎肯定会破坏对称性和传递性。如果默认允许比较不相关的类型,这些事情将更难发现(例如通过静态分析器等工具指出“不太可能相等”等)。

另一种选择可能是以某种方式禁止覆盖 Record 的

equals
,但这也可能会阻止一些合法的用例。

© www.soinside.com 2019 - 2024. All rights reserved.