Effective Java读书笔记(3对于所有对象都通用的方法)

3.1 覆盖equals时请遵守通用约定

什么时候应该覆盖Object.equals()方法呢?

如果类具有自己特有的“逻辑相等”概念(不同于对象等同的概念),而且超类还没有覆盖equals以实现期望的行为,这时我们就需要覆盖equals方法。

Object.equals()方法具有自反性、对称性、传递性、一致性和与null比较返回false的特点。

实现高质量equals方法的诀窍:

(1)使用==操作符检查“参数是否为这个对象的引用”。如果是,则返回true,这是一种性能优化,如果比较操作有可能很昂贵,就值得这么做。

(2)使用instanceof操作符检查“参数是否为正确的类型”。如果不是,则返回false。

(3)把参数转换成正确的类型。因为转换之前进行instanceof测试,所以确保会成功。

(4)对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相匹配。如果这些测试全部成功,则返回true,否则返回false。

(5)当你编写完成了equals方法之后,应该问自己三个问题:它是否是对称的、传递的、一致的?最好能编写单元测试来来检验这些特性。

注意:

a)覆盖equals方法时总要覆盖hashCode方法

b)不要企图让equals方法过于智能

c)不要将equals声明中的Object对象替换成其它的类型

3.2 覆盖equlas方法时总要覆盖hashCode

如果不这样做的话,就会违反Object.hashCode的通用约定,从而导致该类无法结合所有基于散列的结合一起正常运作,这样的集合包括HashMap、HashSet和HashTable。

3.3 始终要覆盖toString

toString的约定指出“建议所有的子类都覆盖这个方法”

3.4 谨慎的覆盖clone

Cloneable接口的目的是作为对象的一个mixin接口,表明这样的对象允许克隆。

3.5 考虑实现Comparable接口

Effective Java读书笔记(3对于所有对象都通用的方法),布布扣,bubuko.com

时间: 2024-10-07 06:33:13

Effective Java读书笔记(3对于所有对象都通用的方法)的相关文章

Effective java 第三章对于所有对象都通用的方法(一) 读书笔记

对于所有对象都通用的方法 覆盖equals时请遵守通用约定 类的每个实例本质上都是唯一的. 不关心类是否提供了逻辑相等的测试功能 超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的. 类是私有的或是包级私有的,可以确定它的equals方法永远不会被调用. throw new AssertionError() 一般覆盖Object.equals都是值类 但有一种值类不需要覆盖equals方法,即实例受控,确保每个值至多只存在一个对象的类.如枚举 覆盖equals方法,通用约定. 自

Effective Java 读书笔记(一):使用静态工厂方法代替构造器

这是Effective Java第2章提出的第一条建议: 考虑用静态工厂方法代替构造器 此处的静态工厂方法并不是设计模式,主要指static修饰的静态方法,关于static的说明可以参考之前的博文<java中final与static的使用场景总结>. 什么是静态工厂方法? 可以参考书中的例子(摘自JDK1.7 java.lang.Boolean) public final class Boolean implements java.io.Serializable, Comparable<

Effective Java 读书笔记(2创建和销毁对象)

第一章是引言,所以这里不做笔记,总结一下书中第一章的主要内容是向我们解释了这本书所做的事情:指导Java程序员如何编写出清晰.正确.可用.健壮.灵活和可维护的程序. 2.1考虑用静态工厂方法代替构造器 静态工厂方法与构造器相比有四大优势: (1)静态工厂方法有名称,具有适当名称的静态工厂方法易于使用.易于阅读: (2)不必每次在调用它们的时候都创建一个新的对象: (3)可以返回原返回类型的任何子类型的对象: (4)在创建参数化类型实例的时候,它们使代码变得更加简洁. 同时静态工厂方法也有两大缺点

[Effective Java 读书笔记] 第三章 对所有对象都通用的方法 第八 ---- ?条

这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对对象进行相等的比较: public boolean equals(Object obj) { return (this == obj); } 那么什么时候需要覆盖equals呢? 当你的类有自己的逻辑相等,而不是对象相等时,应该自己实现equals,比如Date和Interger,他们的相等比较不仅

Effective Java读书笔记(4 类和接口)

4.1 使类和成员的可访问性最小化 要区别设计良好的模块和设计不好的模块,最重要的因素在于,这个模块对于外部的其他模块而言,是否隐藏其内部数据和其他实现细节.设计良好的模块会隐藏所有的实现细节,把它的API与它的实现清晰的隔离开来,然后模块之间只通过API进行通信,一个模块不需要知道其他模块内部的工作情况,这个概念被称为信息隐藏或封装,是软件设计的基本原则之一. 4.2 在公有类中使用访问方法而非公有域 坚持面向对象程序设计思想:如果类可以在它所在的包的外部进行访问,就提供访问方法,以保留将来改

Effective Java:对于所有对象都通用的方法

前言: 读这本书第1条规则的时候就感觉到这是一本很好的书,可以把我们的Java功底提升一个档次,我还是比较推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记总结,希望能够与君共勉. 概述: 这一章主要是说明一些对于所有对象都通用的方法.我们知道Java的多态是其特色之一,而多态的体现方式中就有一种方式叫做"重写".这些概念性的东西我想在大学我们学习Java的初期,老师就会如数家珍一样地灌输给我们,不过,在那个时候有多少人真的了解了什么是重载,什

Effective java读书札记第一条之 考虑用静态工厂方法代替构造器

对于类而言,为了让客户端获取它资深的一个实例,最常用的方法就是提供一个共有的构造器.还有一种放你发,也应该子每个程序员的工具箱中占有一席之地.类可以提供一个共有的静态 工厂方法,它只是返回类的实例的静态方法. 类可以通过静态工厂方法类提供它的客户端(对象),而不是通过构造器.提这样做的好处有: 1.静态工厂方法与构造器不同的第一大优势在于,它们有名称.比如构造器BigInteger(int,int,Random)返回的BigInteger可能为素数,如果用名为BigInteger.probabl

effective java-读书笔记-第三章 对于所有对象都通用的方法

个人博客同步发布:effective java-读书笔记-第三章 对于所有对象都通用的方法 第三章 对于所有对象都通用的方法 所有非final方法(equals.hashCode.toString.clone.finalize)都有明确的通用约定,因为它们被设计成是要被覆盖的,如果不遵守,基于散列的集合(HashMap.HashSet.HashTable)可能无法结合该类一起运作. 第8条 覆盖equals时请遵守通用约定 覆盖equals规范: 自反性(reflexive).对于任何非null

Effective Java阅读笔记——创建和销毁对象(一)

类通常提供一个公有的构造器方法,以此来让客户端可以获取自己(类)的一个实例.但是在创建对象时,应该首先考虑利用静态工厂方法代替构造器来返回一个实例.利用静态工厂方法而不是公有的构造器有几个优势: 静态工厂方法有(不同的)名字 构造器方法都有相同的名字,就是类的名字.区分不同构造器的方法是通过观察方法的签名确定的.方法的签名包括方法名,方法参数的类型,数目以及顺序,方法的返回类型不是方法签名的一部分.无法通过构造器方法名区分不同的构造器,只能通过参数的不同区分,这种情况下(特殊情况下有可能参数类型