package cn.xf.cp.ch02.item8.transitivity; public class Point { private final int x; private final int y; public Point(int x, int y) { this.x = x; this.y = y; } @Override public boolean equals(Object obj) { if(!(obj instanceof Point)) { return false; } Point p = (Point) obj; return this.x == p.x && this.y == p.y; } }
首先写一个点类
然后是一个颜色的,枚举
package cn.xf.cp.ch02.item8.transitivity; public enum Color { RED, ORANGE, YELLOW, GREEN, BLUE, INDIGO, VIOLET }
开始重写其equals方法,来综合比较颜色和点的属性
package cn.xf.cp.ch02.item8.transitivity; public class ColorPoint extends Point { private final Color color; public ColorPoint(int x, int y, Color color) { super(x, y); this.color = color; } //这里写个euqals,来比较颜色点,但是这样的话普通点:颜色点 和 颜色点 :普通点返回不一样 public boolean equals1(Object obj) { if(!(obj instanceof ColorPoint)) { return false; } //这样进行比较,保证父类和自己 return super.equals(obj) && ((ColorPoint) obj).color == color; } //但是上面方法不能区别(1,2)的点和(1,2,red)这样比较的时候,如果我们不想比较颜色的时候 //所以改进,保证x.equals(y)和y.equals(x)保持一致 //但是这样,x.equals(y)和y.equals(z),x.equals(z) public boolean equals2(Object obj) { if(!(obj instanceof Point)) { return false; } if(!(obj instanceof ColorPoint)) { //如果是Point对象不是颜色点对象,那就直接比x,y的大小 return obj.equals(this); } //比较全部内容 return super.equals(obj) && ((ColorPoint) obj).color == color; } }
在实现这样的比较的时候
使用复合优先于继承
我们使用复合的方式来做就会方便很多
package cn.xf.cp.ch02.item8.transitivity; public class ColorPoint2 { private final Point point; private final Color color; public ColorPoint2(int x, int y, Color color) { if(color == null) throw new NullPointerException(); point = new Point(x, y); this.color = color; } public Point asPoint() { return point; } @Override public boolean equals(Object obj) { if(!(obj instanceof ColorPoint2)) return false; ColorPoint2 cp2 = (ColorPoint2) obj; //分别调用本书的equals方法进行比较 return cp2.point.equals(point) && cp2.color.equals(color); } }