第8条:改写equals时请遵守通用约定(Effective java 2E)

什么时候改写:1逻辑相等2确保不被调用时,改写之以抛出异常
约定:自反性,对称性,传递性,一致性,非空性
作者主要解释了对称性,传递性,一致性,
一致性,不要依赖于一些不稳定的因素,如网络等等
对称性,A很花哨的修改了equals方法,终于equal了B,但是B不为所动,不去equal A,
这一般出现在自定义类和其他类库的类equal的时候,譬如书中的CaseInsensitiveString和JDK的String。
作者着重讲述了传递性,例子讲的是增加了成员变量的子类,如果维持和父类equals,结果就丧失了传递性,JDK里的例子Timestamp和Date也是如此。
查看了下TimeStamp.equals()的api,里面有这样一句话,相对于基类中的 equals(Object) 方法而言,此方法是不对称的,此处基类就是指Date啦,Date可以equal Timestamp,但是TimeStamp不能equal Date,结论是,没法解决,除非父类不可实例化,子类之和子类之间equal,那就不会有问题,不然就别用继承,用复合。
关于非空性,作者简略了说了一句,但本人觉得很有用:不需要去判断Object o是否为null在instanceof的时候已经包含了这个功能。

如何写equals
1.先用==看是不是自己
2.instanceof
3.4.5,不写了,你懂的
告诫:
1.要改写hashcode()
2.不要过度的寻求等价关系
3.不要依赖于不稳定资源,防止不一致
4.别把重写变成重载,错误写法equals(MyClass o)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值