gpt4 book ai didi

java - 等于并与 BigDecimal 进行比较

转载 作者:行者123 更新时间:2023-11-30 05:28:58 25 4
gpt4 key购买 nike

我有一个类重写hashCode()和equals()方法。当我处理 BigDecimal 时,我必须使用 compareTo() 而不是 Objects.equals():

public class MyProduct extends Product{

private BigDecimal price;


@Override
public int hashCode() {
return Objects.hash(price);
}


@Override
public boolean equals(Object obj) {

if (this == obj) return true; // is this right or should this be deleted

if (obj == null || getClass() != obj.getClass()) return false;

final Product other = (Product) obj;

// is this right?
if (price == null ? (other.price != null) : price.compareTo(other.price) != 0) {
return false;
}
return super.equals(obj);
}

}

我有以下问题:

  1. 我应该从 equals() 方法中删除 if (this == obj) return true; 行吗?因为使用这一行,compareTo 不会被触发,并且可能会计算出错误的 equals(),对吗?
  2. equals() 方法可以改进吗?

最佳答案

第一行只是一种优化,旨在如果两个引用都指向同一个对象,则提前返回结果。

price 可以为空吗?我认为是这样,因为您正在 equals() 实现中检查它。在这种情况下,如果 other.pricenull,您的代码将无法工作。具体代码在这里:

price.compareTo(other.price) != 0

将抛出一个NullPointerException

你可以这样修复它:

    @Override
public boolean equals(Object obj) {

if (this == obj) return true; // is this right or should this be deleted

if (obj == null || getClass() != obj.getClass()) return false;

final MyProduct other = (MyProduct) obj;

// If you prefer, the below two can be replaced with a single condition
// price != null ^ other.price != null
// Credits to @Andreas
if (price == null && other.price != null) {
return false;
}
if (price != null && other.price == null) {
return false;
}
if (other.price != null && price.compareTo(other.price) != 0) {
return false;
}

return super.equals(obj);
}

现在,您可能可以将其缩短,但我个人认为这种方式最具可读性。

无论如何,除非您真的非常关心自定义 equals() 实现,否则我建议您使用 IDE 生成一个并坚持使用它。他们大多数时候都做得不错,你不必担心它会被破坏(尽管比较 BigDecimals 对他们来说可能很棘手,因为你不关心规模,而只是关心值)。

关于java - 等于并与 BigDecimal 进行比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57964739/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com