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);
} }

【Effective Java】4、覆盖equals时请遵守通用约定的更多相关文章

  1. 第8条:覆盖equals时请遵守通用约定

    第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和fina ...

  2. Item 8 覆盖equals时请遵守通用约定

    在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容:   equals方法实现了等价关系:   自反性.对于任何非null的引用值,x.eq ...

  3. 第八条:覆盖equals时请遵守通用约定

    ==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...

  4. 覆盖equals时请遵守通用约定

    Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...

  5. 第10项:重写equals时请遵守通用约定

      重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...

  6. 覆盖equals方法时请遵守通用约定

    覆盖equals方法时请遵守通用约定   覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...

  7. EffectiveJava(8)覆盖equals是要遵守的约定

    覆盖equals是要遵守的约定 1.覆盖种类: -类的每个1实例本质上都是唯一的 -不关心类是否提供了"逻辑相等"的测试功能(Random测试是否能随机相同数字) -超类已经覆盖了 ...

  8. Effective Java 学习笔记之所有对象都通用的方法

    一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提 ...

  9. 重写equals时,遵守的规定

      0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ...

随机推荐

  1. [转载]CSS教程:实例讲解定位Position

    http://www.missyuan.com/thread-395406-1-1.html 1. position:static 所有元素的默认定位都是:position:static,这意味着元素 ...

  2. Domain Space

    Bluehost Register Page http://www.bluehost.com/track/weipengp

  3. 专访Linux嵌入式开发韦东山操作系统图书作者--转

    CSDN学院讲师韦东山:悦己之作,方能悦人 发表于2015-04-28 08:09| 6669次阅读| 来源CSDN| 24 条评论| 作者夏梦竹 专访Linux嵌入式开发韦东山操作系统图书作者 摘要 ...

  4. node递归属性目录结构

    要求,读取结束后才能输出所有文件 var fs = require('fs');var path = require('path'); var list = [];var count = 0;func ...

  5. POJ 1631 Bridging signals

    Bridging signals Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 9441   Accepted: 5166 ...

  6. npm命令总结

    统一切换到项目目录 安装redux :npm install -save redux 安装react-redux : npm install -save react-redux

  7. 基于SWFUpload的angular上传组件

    回顾 由于工作内容比较多,特别是架构方面,需要耗费很多的时间调整.重构,因此很久没有写文章了. 话就不多说了,直接进入主题. 实现 首先分析一下SWFUpload初始化的时候,需要传入当前触发上传的元 ...

  8. [原]Android打包之Gradle打包

    最近尝试了一下Android的Gradle打包,发现确实比Ant打包会方便很多,特此记录下来. 注:android的gradle现在插件的版本已经是0.14.3了,对于一些老的方法和api,有一些已经 ...

  9. 写的一个Sass 和Compass的例子

    /*1.打开项目根目录下的 config.rb 文件 2.搜索 line_comments 关键词,默认应该是 # line_comments = false 3.去掉前面的 #,保存 config. ...

  10. 在腾讯开发应用中心上架apk所遇到的问题

    这篇只是为了记录我走过的弯路,和判断错误的方法 首先当我用 keyStore打包apk的时候,程序没有报任何错误,当然也可以运行: 接下来就是上传该apk吧: 等上传完了,就报解析错误.如下.: aa ...