【Effective Java】4、覆盖equals时请遵守通用约定
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时请遵守通用约定的更多相关文章
- 第8条:覆盖equals时请遵守通用约定
第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和fina ...
- Item 8 覆盖equals时请遵守通用约定
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容: equals方法实现了等价关系: 自反性.对于任何非null的引用值,x.eq ...
- 第八条:覆盖equals时请遵守通用约定
==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...
- 覆盖equals时请遵守通用约定
Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...
- 第10项:重写equals时请遵守通用约定
重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...
- 覆盖equals方法时请遵守通用约定
覆盖equals方法时请遵守通用约定 覆盖equals方法看起来很简单,但是有许多覆盖方式会导致错误,并且后果很严重.最容易避免这种类问题的方法就是不覆盖equals方法,在这种情况下,类的每个实 ...
- EffectiveJava(8)覆盖equals是要遵守的约定
覆盖equals是要遵守的约定 1.覆盖种类: -类的每个1实例本质上都是唯一的 -不关心类是否提供了"逻辑相等"的测试功能(Random测试是否能随机相同数字) -超类已经覆盖了 ...
- Effective Java 学习笔记之所有对象都通用的方法
一.覆盖equals时请遵守通用约定 1.满足下列任何一个条件时,不需要覆盖equals方法 a.类的每个实例本质上都是唯一的.此时就是Object中equals方法所表达的含义. b.不关心类是否提 ...
- 重写equals时,遵守的规定
0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ...
随机推荐
- iOS开发之时间格式的转化
在开发iOS程序时,有时候需要将时间格式调整成自己希望的格式,这个时候我们可以用NSDateFormatter类来处理. 例如:如何将格式为“12-May-14 05.08.02.000000 PM” ...
- oracle 11g设置打开空表extent储存块
sql>alter system set deferred_segment_creation=false; sql>show parameter deferred_segment_crea ...
- 【PRML读书笔记-Chapter1-Introduction】1.4 The Curse of Dimensionality
维数灾难 给定如下分类问题: 其中x6和x7表示横轴和竖轴(即两个measurements),怎么分? 方法一(simple): 把整个图分成:16个格,当给定一个新的点的时候,就数他所在的格子中,哪 ...
- HTML5[4]:去除不必要的标签,完全使用css实现样式
1)div.span的区别,div默认是沾满一行,span默认是inline 2)去除font之类的标签
- 开发Chrome Extension截取你微博的帐号密码
Google允许开发者对Chrome浏览器做扩展,所以有了之前火爆的12306抢票软件,我 也用它抢过票,一直很好奇它怎么注入js到12306上面的.这周有空研究了下Chrome Extension, ...
- 解决rspec 生成报告时报utf-8错误的方法
找到gems\1.9.1\gems\rspec-core-2.14.3\lib\rspec\core\formatters\snippet_extractor.rb文件中的第27行: 在这边记录一下, ...
- 路由器换大Flash
使用winhex自建编程器固件(我的是TP-WR941N V6) 1:使用winhex新建一个8M,16M的文件,编辑-全选,填充选块,填充十六进制数值 FF : 2:打开4M的原厂编程器固件(或者自 ...
- Mac OS使用ll、la、l等ls的别名命令
在linux下习惯使用ll.la.l等ls别名的童鞋到mac os可就郁闷了-- 其实只要在用户目录下建立一个脚本“.bash_profile”,并输入以下内容即可: alias ll='ls -al ...
- debian软件源source.list文件格式说明
在安装完debian操作系统之后大家做的第一件事大概就是修改source.list文件了吧,否则你是无法在线更新软件的,那么source.list文件中的各个配置项的具体含义你搞懂了么?下面就以我的s ...
- [SLAM] Studying Guidance
Books from Zhihu: 幽默一把 看完Gonzalez:嗯,好像很好玩的样子,我也来搞一搞.看完Price:什么鬼,怎么这么多公式,公式看不懂肿么破.看完Szeliski:原来用一千页的书 ...