使用equals时犯得错

本文通过实例解析了在Java中使用BigDecimal类型进行数值比对时常见的错误方式,并提供了正确的解决方案。

     错误源码:     
     BigDecimal bci345 = chb5.getBci345();
     if(Bci302.NC.equals(bci302)){

           if(!NullFlag.isObjNull(bci345)&& !"0".equals(bci345)){                          
               chc1.setBci338(chc1.getBci307());
               chc1.setBci339(chc1.getBci310());                    
          }
     }

     今天客户跟我反馈不管前台bci345传入的数据是不是等0,结果都是一样的,于是我检查了上面那段代码。第一眼看上去感觉没问题啊,有判断是是否等于0 啊!

      用测试数据跟踪了一遍,确实是否为0 都会进入循环。我想难道BigDecimal数据这样没有取出来,于是我试着换了一种写法:

    BigDecimal bci345 = chb5.getBci345();
     if(Bci302.NC.equals(bci302)){

           if(!NullFlag.isObjNull(bci345)&& !"0".equals(bci345.intValue())){                          
               chc1.setBci338(chc1.getBci307());
               chc1.setBci339(chc1.getBci310());                   
          }
     }

    也还是不行,这时候我突然想到“0”是String型的,而bci435是数值这样比对能行吗?

     于是我试着使用数值的比对

    BigDecimal bci345 = chb5.getBci345();
     if(Bci302.NC.equals(bci302)){

           if(!NullFlag.isObjNull(bci345)&&0 != bci345.intValue()){                          
               chc1.setBci338(chc1.getBci307());
               chc1.setBci339(chc1.getBci310());                   
          }
     }

    果然可以。我又试着这样比对

    BigDecimal bci345 = chb5.getBci345();
     if(Bci302.NC.equals(bci302)){

           if(!NullFlag.isObjNull(bci345)&&!"0".equals(bci345.toString())){                          
               chc1.setBci338(chc1.getBci307());
               chc1.setBci339(chc1.getBci310());                   
          }
     }

    也是可以的。

 

 

    我想问题的症结就在于equls的比较规则:如果两个对象的类型一致,并且内容一致,则返回true。明显我这这段代码中的错误就是比对的对象类型是错误的。

 

 

 

 

 

    

### Java 中重写 `equals` 方法的最佳实践 在 Java 中,为了确保对象之间的正确比较以及集合框架中的正常工作,在自定义类中重写 `equals` 方法应遵循一定的原则。这不仅涉及简单的属性对比,还需要考虑特殊情况下的处理方式。 #### 特殊情况的处理 对于包含其他对象作为成员变量的情况,应当递归调用这些成员变量自身的 `equals` 方法来进行比较[^1]: ```java public class Person { private String name; private Address address; @Override public boolean equals(Object obj) { if (this == obj) return true; // 自身比较返回true if (!(obj instanceof Person)) return false; // 类型不匹配则false Person other = (Person) obj; // 基本数据类型的直接比较 if (!Objects.equals(this.name, other.name)) return false; // 对象类型需通过其equals方法进行比较 return Objects.equals(this.address, other.address); } } ``` 上述代码展示了如何在一个复杂对象(如 `Person`)内正确实现 `equals` 方法。这里特别注意到了内部含有另一个对象 (`Address`) 的情形下应该如何操作——即利用 `Objects.equals()` 来安全地执行 null 安全的对象间比较[^2]。 此外,每当重写了 `equals` 方法之后,也务必同步调整该类的 `hashCode` 实现以维持两者之间的一致性关系。这是因为许多基于哈希表的数据结构依赖于这两个函数的行为一致来保证功能上的准确性[^3]。 #### 关键点总结 - 使用 `instanceof` 进行类型检查可以有效防止运行误。 - 利用 `Objects.equals()` 可简化代码编写过程,并提供更好的空指针保护机制。 - 当存在嵌套对象,应该递归地调用它们各自的 `equals` 方法完成全面而精确的比较。 - 同步修改 `hashCode` 是维护程序稳定性的必要措施之一。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值