覆盖equals时遵守通用约定

不覆盖equals时,类的每个实例都只与它自己相等。

如果类有自己的逻辑相等概念,且超类未覆盖equals以实现期望的行为,这时需覆盖equals。

约定内容:

    1.自反性----对于任何非null的引用值x,x.equals(x)必须返回true

    2.对称性----对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true

    3.传递性----对于任何非null的引用值x,y和z,如果x.equals(y)返回true,且y.equals(z)返回true,则x.equals(z)返回true

    4.一致性----对于任何非null的引用值x和y,只要在equals的比较操作中所用信息未被修改,多次调用返回一致结果

    5.非空性----对于任何非null的引用值x,x.equals(null)必须返回false



我们无法在扩展可实例化的类的同时,既增加新的值组件,又同时保留equals约定。

可以考虑使用复合替代继承。

可以在一个抽象类的子类中增加新的值组件,而不会违反equals约定。

不要使equals方法依赖于不可靠的资源。



诀窍:

    1.使用==操作符检查“参数是否为这个对象的引用”

    2.使用instanceof操作符检查“参数是否为正确的类型”

    3.把参数转换成正确的类型

    4.对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配

    5.为了提高equals方法的性能,优先比较最有可能不一致的域,或者开销最低的域

    6.检查是否满足对称,传递,一致

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值