EffectiveJava(8)覆盖equals是要遵守的约定
覆盖equals是要遵守的约定
1.覆盖种类:
-类的每个1实例本质上都是唯一的
-不关心类是否提供了”逻辑相等”的测试功能(Random测试是否能随机相同数字)
-超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的(Set List Map)
-类是私有的或包级私有的,可以确定它的equals方法永远不会被调用
2.equals的通用约定
-自反性(reflexive):对于任何非null的引用值X,x.equals(x)必须返回true
-对称性(symmetric):对于任何非null的引用值x和y,当且仅当y.equals(x)返回true时,x.equals(y)必须返回true
-传递性(transitive):对于任何非null的引用值x和y和z,如果x.equals(y)返回true,那么y.equals(z)也返回true,z.equals(x)必须为true
-一致性(consistent):对于任何非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修改,多次调用x.equals(y)就会调用x.equals(y)就会一致地返回true,或者一致地返回false
-非空性(Nonnuooity):对于任何非null的引用值X,x.equals(null)必须返回false
3.实现高质量equals方法诀窍
-使用==操作符检查”参数是否为这个对象的引用”
-使用instanceof操作符检查”参数是否为正确类型”
–正确类型:指equals方法所在的类或者接口(Set List Map Map.Entry) 如果类实现的接口改进了equals约定,允许在实现了该接口的类之间进行比较,那么就使用该接口
-把参数转换成正确的类型(转换之前会进行instanceof测试确保成功)
-对于该类中的每个”关键(significant)”域,检查参数中的域是否与该对象中对应的域相匹配
-当编写完成了equals方法后,它是否是对称的,传递的,一致的
-覆盖equals时总要覆盖hashCode
-不要让equals方法过于智能
-不要将equals生命中的Object对象替换为其他类型
public boolean equals(Object o) {
// 违反equals的对称性
// if(o instanceof CaseInsensitiveString)
// return s.equalsIgnoreCase(((CaseInsensitiveString) o).s);
// if(o instanceof String)
// return s.equalsIgnoreCase((String)o);
// return false;
// 解决方案 – CaseInsensitiveString区分字符串大小写
return o instanceof CaseInsensitiveString &&
((CaseInsensitiveString) o).s.equalsIgnoreCase(s);
}
//比较普通点和有色点,以及相反的情形时,可能会得到不同的结果
@Override public boolean equals(Object o){
if(!(o instanceof ColorPoint))
return false;
//cp.equals()进行比较时忽略颜色信息
//提供对称性 牺牲传递性
//无法在扩展可实例化类的同时,既增加新的值组件,同时又保留equals约定
if(!(o instanceof ColorPoint))
return o.equals(this);
return super.equals(o) && ((ColorPoint)o).color == color;
}
//用getClass测试代替instanceof
@Override public boolean equals(Object o){
if(o == null || o.getClass()!=getClass())
return false;
PointString ps =(PointString)o;
return ps.x == x && ps.y == y;
}
EffectiveJava(8)覆盖equals是要遵守的约定的更多相关文章
- 第8条:覆盖equals时请遵守通用约定
第8条:覆盖equals时请遵守通用约定 引言:尽管Object是一个具体类,但是设计它主要是为了拓展.它所有的非final方法(equals.hashCode.toString.clone和fina ...
- 第八条:覆盖equals时请遵守通用约定
==是物理相等 equals是逻辑相等 因为每个类的实例对象本质上都是唯一的 ,利用物理相等(==)是指一个实例只能相等于它自己. 利用逻辑相等是(equals)指 一个实例是否和另一个实例的某些关键 ...
- Item 8 覆盖equals时请遵守通用约定
在覆盖equals方法的时候,你必须要遵守它的通用约定,不遵守,写出来的方法,会出现逻辑错误.下面是约定的内容: equals方法实现了等价关系: 自反性.对于任何非null的引用值,x.eq ...
- 覆盖equals时请遵守通用约定
Object类中非final修饰的方法有equals().hashCode().toString().finalize().clone()1.equals()方法不需要被覆盖的情况:1)实例化的对象只 ...
- 【Effective Java】4、覆盖equals时请遵守通用约定
package cn.xf.cp.ch02.item8.transitivity; public class Point { private final int x; private final in ...
- Effective Java 第三版——10. 重写equals方法时遵守通用约定
Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...
- 第10项:重写equals时请遵守通用约定
重写equals方法看起来似乎很简单,但是有许多重写方式会导致错误,而且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每个实例都只能与它自身相等.如果满足了以 ...
- 重写equals时,遵守的规定
0 正确的equals方法 public class MyClass { // 主要属性1 private int primaryAttr1; // 主要属性2 private int prima ...
- 第8条:覆盖equals时遵守通用约定
如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equa ...
随机推荐
- Linux下hdparm硬盘测速
在Linux下可以使用hdparm对硬盘进行测试或者查看硬盘的相关信息.这样你就知道了硬盘读写速度. Hdparm功能说明:显示与设定硬盘的参数. 语 法:hdparm [-CfghiIqtTvyYZ ...
- 自定义View基础 (1)
前言 自定义View原理是Android开发者必须了解的基础: 在了解自定义View之前,你需要有一定的知识储备: 本文将全面解析关于自定义View中的所有知识基础. 目录 目录 1. View的分类 ...
- CyanogenMod编译
1. 介绍 本文介绍了i9100手机CyanogenMod 13系统的编译方法 2. 系统要求 笔者使用的环境为CentOS-7-x86_64, 用来为i9100编译CM 13,之所以选择最新版的CM ...
- BCB中选择文件对话框TOpenDialog过滤后缀名使用方法
BCB中使用TOpenDialog选择对话框时,直接OpenDialog->Execute()弹出的对话框是显示所有文件的,如果我们希望过滤指定的文件后缀名就需要在Execute()前做一些初始 ...
- mysql 事务、游标
mysql 事务 在MySQL中只有使用了Innodb数据库引擎的数据库或表才支持事务,所以很多情况下我们都使用innodb引擎. 事务处理可以用来维护数据库的完整性,保证成批的SQL语句要么全部执行 ...
- Python编程学习笔记 随时更新
import urllib.request import re url = 'http://stock.sohu.com/news/' html = urllib.request.urlopen(ur ...
- springboot微服务的简单小结
springboot微服务的简单小结 近来公司用springboot微服务,所以小结一下. 基础: 什么是SpingBoot微服务? 如何创建SpringBoot微服务? 如何管理和完善SpringB ...
- 洛谷——P1866 编号
P1866 编号 题目描述 太郎有N只兔子,现在为了方便识别它们,太郎要给他们编号.兔子们向太郎表达了它们对号码的喜好,每个兔子i想要一个整数,介于1和Maxnumber[i]之间(包括1和Maxnu ...
- JD2
Business Requirement Support l Develops and communicates plan to manage vendor review of requirement ...
- Broken Code
给一个sorted array 0 0 0 1 1 1 1,然后找出第一个1的位置. 边界情况:array为空或者全0. 思路:二分查找.为了优化,可以先判断最后一个数是不是0. class Solu ...