通用equals方法

1.1 equals方法

覆盖equals方法必须遵守的约定:

1、自反性

x.equals(x)必须返回true

2、对称性

x.equals(y)的结果与y.equals(x)必须一致

3、传递性

x.equals(y)为true且y.equals(z)为true,则x.equals(z)为true

4、一致性

多次调用equals方法,结果必须一致

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

综合以上五个约定,得出了实现高质量equals方法的诀窍:

1、使用==操作符检查是否为这个对象的引用

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

3、把参数转化成正确的类型

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

5、当编写完equals方法后,测试一下五个约定是否都遵守了

注意点:

1、覆盖equals时总是要覆盖hashCode方法

2、不要企图让equals方法过于智能

3.不要讲equals方法中的Object对象替换为其他的类型,这样其实没有覆盖Object.equals,使用@Override注解可以避免这种问题

一个标准的equals方法的例子:(判断一个手机号是否相等)

public class PhoneNumber {
	private final short areaCode;
	private final short prefix;
	private final short lineNumber;
	
	public PhoneNumber(short areaCode, short prefix, short lineNumber) {
		this.areaCode = areaCode;
		this.prefix = prefix;
		this.lineNumber = lineNumber;
	}
	
	@Override
	public boolean equals(Object o) {
		if(o == this) {
			return true;
		}
		
		if(!(o instanceof PhoneNumber)) {
			return false;
		}
		
		PhoneNumber number = (PhoneNumber)o;
		
		return number.lineNumber == lineNumber &&
				number.prefix == prefix &&
				number.areaCode == areaCode;
	}
}

猜你喜欢

转载自cc414011733.iteye.com/blog/2291328