Java 16 条记录 BigDecimal 等于 & 哈希码

Java 16 records BigDecimal equals & hashcode

我们在日常项目中使用 Lombok,我喜欢它引入的简洁性。我们有一个 BigDecimal 属性的基调,并通过一些努力使它们忽略 Lombok 生成的 equals 和 hashCode 方法中的比例。在 Java 16 中引入的新记录 类 中有没有办法做到这一点?

听起来您正在寻找一种通用方法来改变 equalshashCode 对具有特定现有类型的字段的实现方式。没有办法做到这一点。

您有两个选择:

  1. 在您定义的每个 record 上自己实施 equalshashCode,例如:
record Test(BigDecimal v) {
    public int hashCode() {
        return Util.hashCodeWithoutScale(v);
    }

    public boolean equals(Object o) {
        return Util.equalsForBigDecimalWithoutScale(this, o);
    }
}
  1. 始终使用您定义的包装器:
record Test(BigDecimalWrapperThatIgnoresScaleInHashCodeAndEquals x) {
}

For us this feature seems unusable.

虽然 BigDecimal 接近您的要求,但行为上的不匹配表明您可能更幸运地使用包装器或替代 class,即使它主要委托给现有 class.