假设我在课程field
中有BigDecimal
类型MyClass
。
目前,我在equals
等于实现中使用了大十进制MyClass
方法。
当前代码:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!super.equals(o)) return false;
if (o instanceof MyClass) {
MyClass that = (MyClass) o;
return field != null ? field.equals(that.field) : that.field == null;
}
return false;
}
我想更新我的equals方法以使用Big Decimal的compareTo
方法。
我发现equals
类的compareTo
和BigDecimal
实现不一致。
以下实现是否正确地符合所有equals
合同,如第一种方法?
更新代码:
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!super.equals(o)) return false;
if (o instanceof MyClass) {
MyClass that = (MyClass) o;
return field != null && that.field != null ? field.compareTo(that.field) == 0 : field == null && that.field == null;
}
return false;
}
我们为什么这样做
我们正在与其他应用程序(用C#编写)连接,其中field
被定义为Double
。
我们使用Jackson库进行序列化。
对于前。从另一个应用程序反序列化后,BigDecimal
field
的值为0.0340,当查找列表中的记录时,当前等于实现失败。
我们不想做什么
将field
的类型更改为Double
,因为我们还有其他要求需要我们准确计算计算结果。
其他问题
是否有解决此Double
/ BigDecimal
序列化/反序列化问题的首选方法?
我已经查看了Implementing equals method using compareTo帖子但是这并没有提供有关如何检查空值和其他可能性的信息,因为compareTo
方法会抛出NullPointerException
的null参数。
如果SO仍然广泛,请告诉我。
感谢所有帮助。