3 回答
TA贡献1824条经验 获得超8个赞
第一行只是一种优化,旨在如果两个引用都指向同一对象,则提前返回结果。
可以price为空吗?我认为是的,因为您正在实施中检查它equals()。在这种情况下,您的代码将无法工作,以防other.price万一null。具体这里的代码:
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他们来说可能很棘手,因为你不关心规模而只关心价值)。
TA贡献1806条经验 获得超5个赞
我编写了一个 utitly 方法,可用于比较两个 BigDecimals 而不会抛出 NPE:
// returns true, if val1 is the same as val2
// can this be improved ?
public static boolean isEqual(BigDecimal val1, BigDecimal val2) {
return !((val1 != null ^ val2 != null) || (val2 != null && val1.compareTo(val2) != 0));
}
这可以在 equals 方法中使用:
@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final MyProduct other = (MyProduct) obj;
if(!isEqual(price, other.price)) return false;
return super.equals(obj);
}
TA贡献1880条经验 获得超4个赞
我找到了最简单的方法:
public static boolean isEqual(BigDecimal val1, BigDecimal val2) {
return val1 != null ^ val2 != null && val2 != null && val1.compareTo(val2) != 0;
}
然后在 equals() 中使用它:
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
final MyProduct other = (MyProduct) obj;
if(!isEqual(price, other.price)) return false;
return super.equals(obj);
}
添加回答
举报