Java 16 记录 BigDecimal equals & hashcode

标签 java bigdecimal java-16 java-record

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

最佳答案

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

您有两个选择:

  1. 在您定义的每个记录上自行实现equalshashCode,例如:
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 接近您的要求,但行为上的不匹配表明您可能会更幸运地使用包装器或替代类,即使它很大程度上委托(delegate)给现有类。

    关于Java 16 记录 BigDecimal equals & hashcode,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68690126/

    相关文章:

    java - 为什么Stream#toList的默认实现似乎过于复杂/不够理想?

    java - 错误 : cannot find symbol, 找不到我的 bean

    java - 使用 GWTP 创建表

    java - BigDecimal if 语句不适用于 !运算符(operator)?

    java - BigDecimal.valueOf缓存机制

    java - 关于用户输入的 BigDecimal 计算错误

    java - 为什么 Java 记录的规范构造函数没有比记录级别更严格的访问权限?

    java - 关于分段代码缓存的小问题 (http ://openjdk. java.net/jeps/197)

    java - 使用 SimpleDateFormat.parse 时弄错月份

    java - 说一个类型是 "boxed"是什么意思?