EffectiveJava2_Item7在改写equals方法的时候遵守通用约定

import java.awt.Color;

public class Point {

	private final int x;

	private final int y;

	public Point(int x, int y) {
		this.x = x;
		this.y = y;
	}

	public boolean equals(Object o) {
		if (!(o instanceof Point))
			return false;
		Point p = (Point) o;
		return p.x == x && p.y == y;
	}
	
}

/**
 * 采用继承扩展类后覆盖的equals方法存在缺陷
 * @author Administrator
 */
class ColorPoint extends Point{
	
	private Color color;

	public ColorPoint(int x, int y,Color color) {
		super(x, y);
		this.color = color;
	}
	
	/**
	 * 不具有对称性
	 */
	public boolean equals(Object o){
		if(!(o instanceof ColorPoint))
			return false;
		ColorPoint cp = (ColorPoint) o;
		return super.equals(o) && cp.color == color;
	}
	public static void main(String[] args) {
		ColorPoint p1 = new ColorPoint(1,2,Color.RED);
		Point p2 = new Point(1,2);
		System.out.println(p1.equals(p2));
		System.out.println(p2.equals(p1));
	}
	
//	/**
//	 * 不具有传递性
//	 */
//	public boolean equals(Object o){
//		if(!(o instanceof Point))
//			return false;
//		if(!(o instanceof ColorPoint))
//			return o.equals(this);
//		
//		ColorPoint cp = (ColorPoint) o;
//		return super.equals(o) && cp.color == color;
//	}
//	public static void main(String[] args) {
//		ColorPoint p1 = new ColorPoint(1,2,Color.RED);
//		Point p2 = new Point(1,2);
//		ColorPoint p3 = new ColorPoint(1,2,Color.BLUE);
//		System.out.println(p1.equals(p2));
//		System.out.println(p2.equals(p3));
//		
//		System.out.println(p1.equals(p3));
//	}
}

class ColorPointOK {
	
	private Point point;//组合一个point对象,不采用继承
	
	private Color color;//新增属性
	
	public ColorPointOK(int x,int y,Color color){
		point = new Point(x,y);
		this.color = color;
	}
	
	public Point asPoint(){
		return point;
	}
	
	public boolean equals(Object o){
		if(!(o instanceof ColorPointOK))
			return false;
		ColorPointOK cp = (ColorPointOK) o;
		return cp.point.equals(point) && cp.color.equals(color);
	}
}
//总结:可以在一个抽象类的子类中增加新的特征,而不会违反equals的约定。只要不可能创建超类的实例,那么前面所述的种种问题都不会发生
//      不需要进行if(o == null) return false;的检查,因为o instanceof ColorPointOK检查时如果o == null 则检查结果为false
//      高质量equals方法的步骤:
//		1)使用==操作符检查"实参是否为指向对象的一个引用"。如果是的话,则返回true
//		2)使用instanceof操作符检查"实参是否为正确的类型"。如果不是的话则返回false。这里"正确的类型"是指equals方法所在的那个类。有些情况下,是指该类所实现的某个接口。如果一个类实现的一个接口改进了equals约定,允许在实现了该接口的类之间进行比较,那么使用这个接口作为正确的类型。jdk的集合接口具有这样的特点
//		3)上述instanceof测试成功后把实参转换到正确的类型。
//		4)对于该类中的每一个关键域,检查实参中的域与当前对象中对应的域值是否匹配。如果所有测试都成功,则返回true,否则返回false;(本条更详细的描述请参见effectiveJavaItem7)
//		5)当你编写完了equals方法之后,应该问自己三个问题:他是否是对称的、传递的、一致的(其他两个特性(非空、自反)通常会自行满足)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值