如何写出高质量的equals方法

public boolean equals(Object o) {
	if (o == this) //1.使用==操作符检查“参数是否为这个对象的引用”	    
                    return true;
	if (!(o instanceof List))//2.使用instanceof操作符检查“参数是否为正确的类型”
	    return false;

	ListIterator<E> e1 = listIterator();
	ListIterator e2 = ((List) o).listIterator();//3.把参数转换成正确的类型
	while(e1.hasNext() && e2.hasNext()) {
	    E o1 = e1.next();
	    Object o2 = e2.next();
	    if (!(o1==null ? o2==null : o1.equals(o2)))//4.对于该类中的每个“关键(significant)”域,检查参数中的域是否与该对象中的对应域相匹配
		return false;
	}
	return !(e1.hasNext() || e2.hasNext());
    }

 

上面的实例代码是AbstactList的equals方法。

 

《Effective Java》提出的equals方法的通用约定

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

·对称性:对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)返回true。

·传递性:对于任何非null的引用值x、y和z,当且仅当y.equals(x)返回true,并且y.equals(z)返回true时,x.equals(z)返回true

·一致性:对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会一致地返回true,或者一致地返回false

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

 

实现高质量equals方法的诀窍

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

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

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

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

5.编写完equals方法后,应该问自己三个问题:它是否是对称的、传递的、一致的

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值