【问题标题】:Java 16 records BigDecimal equals & hashcodeJava 16 记录 BigDecimal 等于和哈希码
【发布时间】:2021-10-11 20:27:30
【问题描述】:

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

【问题讨论】:

  • 请注意,equals() 记录合同非常强大;通过调用它的访问器并将结果反馈给规范构造函数来“克隆”记录一定会产生一个 equals 实例。
  • 记录的理念是强制BigDecimal 的实例在创建记录时始终以相同的方式缩放,而不是覆盖equals

标签: java bigdecimal java-16 java-record


【解决方案1】:

听起来您正在寻找一种通用方法来更改 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) {
}

对我们来说,这个功能似乎无法使用。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-09-13
    相关资源
    最近更新 更多