尽管Object是一个具体的类,但设计它主要是为了扩展。它的所有非final方法都有明确的通用约定。任何一个类在override时,必须遵守这些通用约定。

一、覆盖equals时请遵守通用的约定

  1、Object中默认的equals方法约定是:类的每个实例都只与它自身相等。当类有自己特有的“逻辑相等”的概念时,就应该覆盖equals方法。

  2、Timestamp对Date进行了扩展,Timestamp的equals实现确实违反了对称性。如果Timestamp和Date混合一起使用,可能导致不正确的行为。

  3、不要使equals方法依赖于不可靠的资源。

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

    a、使用==操作符检查”参数是否为这个对象的引用“。

    b、使用instanceof操作符检查”参数是否为正确的类型“。

    c、把参数转变成正确的类型。

    d、对于该类中的每个关键域,检查参数中的域是否与该对象中对应的域相匹配。

    e、完成equals方法后,检查是否对称、传递和一致。

  注意:

    a、覆盖equals方法后,一定要覆盖hashCode方法。

    b、不要让equals方法过于智能。

    c、不要将equals声明中的Object对象替换成其他类型。借助@Override可解决此问题。

二、覆盖equals时总要覆盖hashCode

  1、如果覆盖了equals方法却不覆盖hashCode方法将导致该类无法和基于散列的集合一起正常运作。

  2、相等的对象必须有相等的散列码。

  3、equals方法和hashCode方法最好使用相同的域。在计算散列码时,加入乘法使得散列码是顺序相关的,更加严谨和合理。

  4、对于不可变类,散列码可进行缓存和赖加载优化。

  5、不要试图从散列码计算中排除掉一个对象的关键部分来提高性能。

三、始终要覆盖toString方法

  1、提供好的toString方法可以是类用起来更加舒适。  

  2、toString方法返回对象中包含的所有值得关注的信息。

  3、是否制定返回值的格式可以根据实际情况来定。

  4、对于toString返回值包含的所有信息,提供一种编程式的访问途径。

四、谨慎地覆盖clone方法

  1、Cloneable接口的目的是作为对象的一个mixin接口,没有包含任何方法。它决定了Object中受保护的clone方法实现的行为。

  2、实现了Cloneable的类,我们总是期望它也提供一个功能适当的公有的clone方法。

  3、clone方法就是另一个构造器,你必须确保它不会伤害到原始的对象,并确保正确地创建被克隆对象中的约束条件。

  4、拷贝构造器和拷贝工厂是实现对象拷贝的好办法。所有通用集合都实现了一个拷贝构造器。

  5、尽量不去覆盖clone方法,也从来不去使用它,除非拷贝数组。

五、考虑实现Comparable接口

  1、comparaTo方法不是Object中的方法,而是Comparable接口中唯一的方法。该方法不仅可进行等同性比较,还可以进行顺序比较。

  2、接口的通用约定是按照equals方法来定义的,但有序集合使用了compareTo方法的等同性测试。

  3、如果是是一个值类,而且具有明显的内在排序关系,就因该坚决实现该接口。

Effective Java 读书笔记之二 对于所有对象都通用的方法的更多相关文章

  1. 《Effective Java》第3章 对于所有对象都通用的方法

    第8条:覆盖equals时请遵守通用约定 覆盖equals方法看起来似乎很简单,但是有许多覆盖方式会导致错误,并且后果非常严重.最容易避免这类问题的办法就是不覆盖equals方法,在这种情况下,类的每 ...

  2. Effective Java 读书笔记(二):对象通用方法

    1 重写equals方法时请遵守通用约定 (1)无需覆盖equals方法的情况 要求独一无二 不要求逻辑相等 超类已经覆盖equals方法,对其子类也适用 一个类是私有的或者是包私有(可以重写后抛出异 ...

  3. 《Effective Java》第2章 对所有对象都通用的方法

    第10条:覆盖equals时,请遵守通用约定 1.使用==来比较两个对象的时候,比较的是两个对象在内存中的地址是否相同(两个引用指向的是否为同一个对象):Object中定义的equals方法也是这样比 ...

  4. Effective Java 读书笔记之一 创建和销毁对象

    一.考虑用静态工厂方法代替构造器 这里的静态工厂方法是指类中使用public static 修饰的方法,和设计模式的工厂方法模式没有任何关系.相对于使用共有的构造器来创建对象,静态工厂方法有几大优势: ...

  5. 【Effective Java读书笔记】创建和销毁对象(一):考虑使用静态工厂方法代替构造器

    类可以提供一个静态方法,返回类的一个静态实例,如Boolean包装类的一个获取实例的静态方法 public static Boolean valueOf(boolean b) { return (b ...

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

    这一章主要讲解Object类中的方法, Object类是所有类的父类,所以它的方法也称得上是所有对象都通用的方法 第八条 覆盖equals时需要遵守的约定 Object中的equals实现,就是直接对 ...

  7. Effective Java:对于全部对象都通用的方法

    前言: 读这本书第1条规则的时候就感觉到这是一本非常好的书.可以把我们的Java功底提升一个档次,我还是比較推荐的.这里我主要就关于覆盖equals.hashCode和toString方法来做一个笔记 ...

  8. Java高效编程之二【对所有对象都通用的方法】

    对于所有对象都通用的方法,即Object类的所有非final方法(equals.hashCode.toString.clone和finalize)都有明确的通用约定,都是为了要被改写(override ...

  9. [Effective Java]第三章 对所有对象都通用的方法

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

随机推荐

  1. wpf读取mysql字段类型为text的问题

    在读取数据库中的字段时,可能会根据环境的不同导致一些字段的读取方式不尽相同,在sql数据库中读取字段值用的最多的算是dataTable.Rows[行][列],但是到了mysql中就会有一些差别,在fl ...

  2. Apache+php+mysql+SQLyog在windows7下的安装与配置图解

    先准备好软件: Apache官方下载地址:httpd-2.2.25-win32-x86-openssl-0.9.8y.msi,更多版本在这里: php官方下载地址:php-5.4.37-Win32-V ...

  3. HTML教程

    HTML文档可以包含的内容 通过不同的标签,HTML文档可以包含不同的内容,比如文本,链接,图片,列表,表格,表单,框架等. 文本 HTML对文本的支持是最丰富的,你可以设置不同级别的标题,分段和换行 ...

  4. ListView 里面嵌套 GridView 遇到的问题及其解决方法。

    我们直接入主题.所有问题例子请参照下图 1,怎样使图片具有点击事件? 答: 解决方法: 在你的BaseAdapter里面不要设置下面这三个东西,然后再设置GridView的onItemClick. g ...

  5. lightbox图片展示效果

    1.lightbox 头部导入: <script type="text/javascript" src="../Public/Js/prototype.js&quo ...

  6. super的作用(转自百度)

    super出现在继承了父类的子类中.有三种存在方式:第一种super.xxx;(xxx为变量名或对象名)这种方法意义为,获取父类中的名字为xxx的变量或方法引用.使用这种方法可以直接访问父类中的变量或 ...

  7. VS插件开发,启用实验室环境

    启用外部程序: C:\Program Files (x86)\Microsoft Visual Studio 14.0\Common7\IDE\devenv.exe 命令行参数 /rootsuffix ...

  8. sqlmap写文件为空之谜

    恰逢有一个SQL注入可以通过sqlmap进行,而且权限高得离谱,直接就是root权限.既然是root权限当然是想直接getshell咯.可是只是sqlmap -u xxx --os-shell的时候却 ...

  9. [问题] UISearchBar 点击取消后跳动的问题

    问题详情: 首先是TableView 作为 NavigationController 的 RootViewContrller, 然后UISearchBar   添加到TableView 的 headV ...

  10. 在CentOS上搭建apache和PHP服务器环境(转)

    1.您也可以使用一键自动部署环境的工具,请参见网友开发的这个工具 http://www.centos.bz/2013/08/ezhttp-tutorial/ 2. 安装: wget -c http:/ ...