覆盖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是要遵守的约定的更多相关文章

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

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

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

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

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

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

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

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

  5. 【Effective Java】4、覆盖equals时请遵守通用约定

    package cn.xf.cp.ch02.item8.transitivity; public class Point { private final int x; private final in ...

  6. Effective Java 第三版——10. 重写equals方法时遵守通用约定

    Tips <Effective Java, Third Edition>一书英文版已经出版,这本书的第二版想必很多人都读过,号称Java四大名著之一,不过第二版2009年出版,到现在已经将 ...

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

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

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

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

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

    如果不需要覆盖equals方法,那么就无需担心覆盖equals方法导致的错误. 什么时候不需要覆盖equals方法? 1.类的每个实例本质上是唯一的. 例如对于Thread,Object提供的equa ...

随机推荐

  1. Codeforces Round #324 (Div. 2) D

    D. Dima and Lisa time limit per test 1 second memory limit per test 256 megabytes input standard inp ...

  2. jquery 的ajax

    一,$.get(url,[data],[callback]) 说明:url为请求地址,data为请求数据的列表(是可选的,也可以将要传的参数写在url里面),callback为请求成功后的回调函数,该 ...

  3. wordpress对使用的国外主题进行本地汉化

    wordpress有非常多优秀与专业的主题,当然大多数是非中文的 这些主题本身总会有些无法通过wordpress admin后台来配置的在页面上的英文输出 此时你可以去对应的代码去改掉那些输出,不过这 ...

  4. HDU2041 简单DP+规律

    超级楼梯 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others)Total Submis ...

  5. 洛谷P1522 牛的旅行

    题目描述 农民 John的农场里有很多牧区.有的路径连接一些特定的牧区.一片所有连通的牧区称为一个牧场.但是就目前而言,你能看到至少有两个牧区通过任何路径都不连通.这样,Farmer John就有多个 ...

  6. KnockJs 绑定语法

    按照汤姆大叔的教程,学习了KnockJs相关知识,练习一下KnockoutJs的绑定语法. 相关的教程大家可以去看 汤姆大叔的博客. 练习代码下载 由于没有环境,代码直接用记事本写的,可能比较乱,仅作 ...

  7. OpenGL入门学习(七)(转)

    http://blog.chinaunix.net/uid-20622737-id-1912803.html 今天要讲的是OpenGL光照的基本知识.虽然内容显得有点多,但条理还算比较清晰,理解起来应 ...

  8. linux free 命令 ,讲解得比较好

    解释一下Linux上free命令的输出. 下面是free的运行结果,一共有4行.为了方便说明,我加上了列号.这样可以把free的输出看成一个二维数组FO(Free Output).例如: FO[2][ ...

  9. SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条

    SQL Server分页语句ROW_NUMBER,读取第4页数据,每页10条 SELECT Id,[Title],[Content],[Image] FROM ( SELECT ROW_NUMBER( ...

  10. 最近看点JAVA

    这本的书名:<求精要决:JAVA EE编程开发安全精解> 请得很懂 试一下servlet代码: <!DOCTYPE html> <html> <head> ...