Java 16 条记录 BigDecimal 等于 & 哈希码
Java 16 records BigDecimal equals & hashcode
我们在日常项目中使用 Lombok,我喜欢它引入的简洁性。我们有一个 BigDecimal 属性的基调,并通过一些努力使它们忽略 Lombok 生成的 equals 和 hashCode 方法中的比例。在 Java 16 中引入的新记录 类 中有没有办法做到这一点?
听起来您正在寻找一种通用方法来改变 equals
和 hashCode
对具有特定现有类型的字段的实现方式。没有办法做到这一点。
您有两个选择:
- 在您定义的每个
record
上自己实施 equals
和 hashCode
,例如:
record Test(BigDecimal v) {
public int hashCode() {
return Util.hashCodeWithoutScale(v);
}
public boolean equals(Object o) {
return Util.equalsForBigDecimalWithoutScale(this, o);
}
}
- 始终使用您定义的包装器:
record Test(BigDecimalWrapperThatIgnoresScaleInHashCodeAndEquals x) {
}
For us this feature seems unusable.
虽然 BigDecimal
接近您的要求,但行为上的不匹配表明您可能更幸运地使用包装器或替代 class,即使它主要委托给现有 class.
我们在日常项目中使用 Lombok,我喜欢它引入的简洁性。我们有一个 BigDecimal 属性的基调,并通过一些努力使它们忽略 Lombok 生成的 equals 和 hashCode 方法中的比例。在 Java 16 中引入的新记录 类 中有没有办法做到这一点?
听起来您正在寻找一种通用方法来改变 equals
和 hashCode
对具有特定现有类型的字段的实现方式。没有办法做到这一点。
您有两个选择:
- 在您定义的每个
record
上自己实施equals
和hashCode
,例如:
record Test(BigDecimal v) {
public int hashCode() {
return Util.hashCodeWithoutScale(v);
}
public boolean equals(Object o) {
return Util.equalsForBigDecimalWithoutScale(this, o);
}
}
- 始终使用您定义的包装器:
record Test(BigDecimalWrapperThatIgnoresScaleInHashCodeAndEquals x) {
}
For us this feature seems unusable.
虽然 BigDecimal
接近您的要求,但行为上的不匹配表明您可能更幸运地使用包装器或替代 class,即使它主要委托给现有 class.