`
schumee
  • 浏览: 25850 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

Effective Java 学习笔记第7条 --- 在改写equals方法时请遵守通用约定

阅读更多

下列情况是不需要改写equals方法的:

  1. 同一个类的不同实例本质上是唯一的,就是个实例都有自己的本体(Identify)。
  2. 不关心该类是否提供了逻辑相等的功能。
  3. 父类已经改写过equals方法,对于子类来说,继承过来的equals方法已经是最合适的了。
  4. 一个类是私有的或者是包可见的,且确定它的equals方法不会被调用。

对于需要改写equals方法的时候,应该遵守如下约定:

  1. 自反性,即x.equals(x)为true.
  2. 对称性,即当且仅当x.equals(y)为true时y.equals(x)也一定为true。
  3. 传递性,即对任意的x,y,z,如果x.equals(y)为true,并且y.equals(z)也为true,那么x.equals(z)也必须为true。
  4. 一致性,即对于任意的x,y,如果x,y都没有被修改的话,那么多次调用x.equals(y)要么一致地返回ture,要么一致地返回false.
  5. 对于非空的引用x,x.equals(null)一定要返回false.

改写equals方法时的建议:

  1. 用==操作符检查实参是否为指向对象的同一个引用。
  2. 使用instanceOf检查实参是否是正确的类型。
  3. 在2的基础上,把实参转换成正确的类型。
  4. 检查实参的域与当前对象的域值是否相等。
  5. 编写完equals方法后,检查是否满足等价关系。

例如:

public boolean equals(Object o)
{
       if(o== this) return true;
       if(!(o instanceof xxxx) return false;
       xxx in = (xxx)o;
       return ……..
} 
 

改写equals方法的告诫:

  1. 不要企图让equals方法做太多事。
  2. 不要使equals依赖不可靠的资源,否则会违背一致性。
  3. 不要将equals中的对象装换为其他的类型。
  4. 要注意的时候不要提供这样的方法public boolean equals(MyClass o)这样是重载并不是覆盖Object的equals方法。

总结:不用重写equals方法就尽量不要去找麻烦,确实需要改写equals方法时,遵守通用约定,因为对象会在程序中不停的传递,所以可能会导致程序运行不正常,甚至崩溃而很难找到程序崩溃的原因。总之,还是遵守约定吧!

分享到:
评论

相关推荐

    effective java 读书笔记

    《Effective Java》是Java开发领域的经典著作,作者Joshua Bloch深入浅出地阐述了编写高效、健壮的Java代码的技巧和最佳实践。以下是对该书部分内容的详细解释: 1. **产生和销毁对象** - Item1:静态工厂方法相比...

    Effective Java第三版1

    1. **覆写equals时遵守通用规定**:重写`equals()`时,应遵循“ Reflexive、Symmetric、Transitive、Consistency 和 Non-null”五原则,同时必须与`hashCode()`一起覆写。 2. **覆写hashCode**:确保相等的对象有...

    java学习笔记.pdf

    ### Java学习笔记知识点总结 #### 第一章:Java语言入门 - **1.1 Java的诞生** Java由Sun Microsystems公司于1995年推出的一种可移植、面向对象的编程语言。最初的设计目标是为消费电子产品提供一种通用编程语言...

    重写equals方法

    3. 访问控制权限可以不同,但是子类重写父类的方法时,访问控制权限必须大于父类。 例如,public boolean equals(Object o) 是一个正确的重写方法,而 public boolean equals(String o) 是一个重载方法,而不是重写...

    Effective-Java-2nd-Edition-(May-2008).zip_effective java

    2. **重写equals()和hashCode()**:Bloch建议当重写equals()方法时,也应同时重写hashCode(),以确保对象在散列结构(如HashSet或HashMap)中的行为正确。 3. **枚举代替常量类**:书中推荐使用枚举类型替代传统的...

    effectiveJava的笔记

    《Effective Java》是Java开发领域的经典著作,由Joshua Bloch编写,旨在提供一系列实用的编程准则和最佳实践。这本书的第三版包含了大量更新,涵盖了Java语言和平台的新发展,如Java 8和Java 9的新特性。以下是对...

    Effective-Java读书笔记

    《Effective Java》是Java编程领域的一本经典著作,由Joshua Bloch撰写,它提供了许多实用的编程指导原则,帮助开发者写出更高效、更可维护的代码。这本书分为多个条目,每个条目都深入探讨了一个特定的Java编程实践...

    Java中equals方法隐藏的陷阱

    ### Java中equals方法隐藏的陷阱 在Java编程中,正确实现`equals`方法至关重要,它不仅影响对象的比较逻辑,还直接关系到集合类(如`HashSet`、`HashMap`等)的行为。本文将深入探讨Java中`equals`方法的一些常见...

    java实战经典学习笔记

    ### Java实战经典学习笔记知识点概览 #### 一、Java概述及开发环境搭建 - **Java概述** - Java是一种广泛使用的高级编程语言,由Sun Microsystems于1995年发布。 - Java的设计目标是“一次编写,到处运行”,这...

    effective-java 配套代码

    6. **重写equals()和hashCode()方法(Overriding equals() and hashCode())**: 代码展示了如何正确实现这两个方法以遵循合同,尤其是在实现集合类时的注意事项。 7. **接口与抽象类(Interfaces vs Abstract ...

    Java-多态--学习笔记.docx

    1. **多态应用**:多态性允许我们使用一个类型的引用指向它的子类型实例,这样在调用相同的方法时,会根据实际的对象类型执行不同的操作。这种现象在程序设计中非常常见,例如在处理不同类型的动物时,虽然都具有...

    java学习笔记

    ### Java学习笔记知识点详解 #### 一、Java面向对象编程思想 面向对象编程(Object-Oriented Programming, OOP)是Java的核心特性之一。通过封装、继承和多态这三个基本特征来实现。OOP能够提高代码的复用性和可...

    java中的==和equals()方法1

    在Java编程语言中,了解如何正确使用`==`和`equals()`方法是非常关键的,因为它们在比较对象和基本类型时有不同的行为。下面将详细解释这两个方法的工作原理、使用场景以及一些常见误区。 首先,`==`运算符主要用于...

    JAVA学习笔记整理(全)

    JAVA学习笔记整理全面涵盖了从基础语法到高级技术的多个领域,包括数据库管理、Web服务器、缓存技术、框架、容器、网络、虚拟机、操作系统、数据结构和操作系统等多个方面。以下将详细介绍其中的关键知识点。 一、...

    java基础学习笔记.doc

    Java是一种广泛使用的面向对象的编程语言,其基础知识是学习Java编程的基石。下面将详细讲解在给定的学习笔记...这些是学习Java编程时的基础内容,深入理解和熟练运用这些知识将有助于进一步学习更复杂的Java编程技术。

    effectiveJava课件分享

    在编程领域,特别是Java开发中,"Effective Java"是一本非常经典的书籍,由Joshua Bloch撰写,书中提出了一系列最佳实践和设计原则,以帮助开发者编写出更高效、更安全的代码。根据提供的标题和描述,我们将探讨三个...

    JAVA学习笔记(全面)

    ### JAVA学习笔记(全面) #### 一、Java技术基础 ##### 1.1 编程语言 编程语言是计算机能够理解和执行的一种指令集。根据不同的编程思维和应用场景,编程语言可以分为以下几类: - **机器语言**:由二进制代码...

Global site tag (gtag.js) - Google Analytics