`
sam406
  • 浏览: 59831 次
  • 性别: Icon_minigender_1
  • 来自: 成都
社区版块
存档分类
最新评论

读书笔记effective之对所有对象通用的方法

    博客分类:
  • java
 
阅读更多
读书笔记effective之对所有对象通用的方法
 第一条 覆盖equals时遵守通用约定
   覆盖equals方法似乎很简单,但是许多覆盖方式会导致错误,并且后果非常严重,如果满
足下面任何一个条件就是所期望的结果
     类的每个实例本质上都是唯一的
     不关心类是否提供了“逻辑相等”的测试功能
     超类已经覆盖了equals,从超类继承过来的行为对于子类也是合适的
     类是私有的的或是包机私有的,可以确定它的equals方法永远不会被调用

要覆盖equals 需要遵守的约定

    自反性:对于任何非null的引用值x,x.equals(x)必须返回true
    对称性:对于任何非null 引用值x和y,当且仅当y.equals(x)返回true,并且y.equals.
            (x)也必须返回true.
    传递性:对于任何非null的引用值x,y和z,如果x.equals(y)返回true,并且y.equals(z)
           也返回true,那么x.equals(z)也必须返回true,

    看一个简单的不可变得二维整数Point类

    
public  class Point{
        private final int x;
        private final int y;
             this.x=x;
             this.y=y;    
         }
      public boolean equals(Object o){ 
         if(!o instanceof Point){ 
           return false; 
           Point p=(Point)o;
           return p.x=x&&p.y==y;
           }
           }

   假设你想要扩展这个类,为一个点添加颜色信息
    
      
 public  class ColorPoint extends{
         private final Color color;
         }
         public ColorPoint(int x,int y,Color color){
           super(x,y);
            this.color=color;
             }
      public boolean equals(Object o){ 
         if(!o instanceof ColorPoint){ 
           return false; 
           
           return super.equals(o)&&((ColorPoint)o).color==color;
           }
           }

          上面的实例在比较相反时可能得到不同的结果
       
     Point p=new Point(1,2);
             ColorPoint cp=new ColorPoint(1,2,Color.RED) ;

        p.equals(cp)返回true ,而cp.equals(p)返回false, 这主要是参数类型不正确,子
类和父类的equals的内部不一样。一种解法是父类为abstract 类型,子类添加新的组件,就
不会违背equasl约定。
      
    一致性:对于非null的引用值x和y,只要equals的比较操作在对象中所用的信息没有被修
改,多次调用x.quals(y)就会一直返回true,或者一种地返回false
     对于任何非null的引用值x,x.equals(null)必须返回null
  实现equals方法的技巧

1 使用==操作符检查“参数是否为这个对象的引用”
2 使用instanceof操作符检查"参数是否为正确的类型"
3 把参数转换成正确类型
4 对于该类中的每个“关键”域,检查参数中的域是否与该对象中对应的域相配备

  第二条  覆盖equals时总要覆盖hashCode
  
      在应用程序的执行期间,只要对象的equals方法的比较操作所用到的信息没有被修改,那么对这同一队形调用多次,hashCode 方法都必须始终如一地返回同一整数。在同一个应用程序的多次执行过程中,每次执行所返回的整数可以不一致。
     如果两个对象根据equals(Object)方法比较是相等的,那么调用这两个对象中任意一个对象的hashCode方法都必须产生同样的结果
    如果两个对象根据equals(Object)方法比较是不相等的,那么调用这两个对象中的任意一个对象的hashCode 方法,则不一定产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列函数的性能。
   
   
分享到:
评论

相关推荐

    effective c++读书笔记

    从给出的部分内容来看,读书笔记主要聚焦于以下几个知识点: 1. C++语言的联邦概念:C++是一个由多个次语言构成的语言联邦,这包括了C语言核心、面向对象的C++、模板C++以及标准模板库(STL)。这种理解对于深入...

    effective java 读书笔记

    - Item8:equals方法应与`==`操作符一致,同时对所有字段进行比较。注意,不要忘记比较类的`this`引用。 - Item9:当覆盖equals时,必须同时覆盖hashcode,以保持哈希表的行为一致性。 - Item10:toString方法应...

    《Effective STL》学习笔记

    《Effective STL》是Scott Meyers的一本经典著作,旨在帮助读者深入理解并有效利用STL(Standard Template ...通过阅读“STL源码剖析笔记.doc”,我们可以进一步探索STL的具体实现细节,增强对STL底层工作的认识。

    Effective Java.zip

    - 工厂方法:介绍工厂方法模式,作为创建对象的抽象接口,提供更大的灵活性。 - 可枚举类型(enum):推荐使用枚举代替常量类,因为枚举具有内置的单例特性且更安全。 2. **第4章 类和接口** - 抽象类与接口:...

    Effective STL

    《Effective STL》中文版附带的中文笔记,将帮助读者更轻松地理解书中复杂的概念和技术,通过实例和解释加深对STL的理解,提升C++编程能力。阅读此书,不仅能够掌握STL的使用技巧,还能培养出良好的编程习惯和思维...

    c++学习好方法 适合任何人

    C++是一种强大的、通用的编程语言,被广泛应用于系统软件、应用软件、游戏开发、设备驱动程序、嵌入式系统等各个领域。学习C++不仅可以提升编程能力,还能深入理解计算机底层工作原理。以下是一些关于C++学习的好...

    java8集合源码-Effective-Kotlin-Examples:注释和示例

    java8集合源码有效的 Kotlin - 示例 免责声明:这个存储库包含我在阅读优秀书籍 Effective ...一种指定参数期望的通用方法。 懒惰的消息 聪明的演员 - 合同 检查块 - 一种指定状态期望的通用方法。 断言块 -

    C++整合版 菜鸟到高手(包含源码-视频-笔记).docx

    - C++是一种静态类型的、编译式的、通用的、大小写敏感的、不规则的编程语言,支持过程化编程、面向对象编程和泛型编程。 - C++由Bjarne Stroustrup于1979年在贝尔实验室开始设计开发。 2. **安装与配置C++开发...

    学习C++的忠告50条

    《Effective C++》、《More Effective C++》和《Exceptional C++》等书籍是学习C++的经典之作,它们涵盖了C++编程的最佳实践和常见陷阱。 #### 23. 学会使用工具 学会使用版本控制工具(如Git)、调试工具(如GDB)...

    高质量C++编程指南

    此外,阅读经典书籍如《C++ Primer》和《Effective Modern C++》,以及官方文档和高质量的开源项目,也是提升编程技能的重要途径。 综上所述,高质量的C++编程是一个综合考虑代码功能、可读性、可维护性和性能的...

    学习c++的50条忠告(初学者必看)

    - **建议**:同时参考《The C++ Programming Language》和《Inside The C++ Object Model》,这两本书对深入理解C++标准库和对象模型非常有用。 #### 3. 编译器选择 - 选择合适的编译器非常重要,如Visual C++、GCC...

    给C++初学者的忠告

    - **建议**:阅读经典书籍如《Effective Object-Oriented Software Construction》、《Design Patterns》等,掌握常用的设计模式,并将其应用于实际项目中。 #### 33. 参加C++专项竞赛或认证考试 - **解释**:通过...

    前辈的c++50个建议

    《Effective C++》、《More Effective C++》以及《Exceptional C++》都是经典之作,它们涵盖了大量关于如何写出高效、可维护代码的最佳实践。 ### 24. 学习并理解C++的内存管理机制 C++允许程序员直接操作内存,这...

    CppPractice:自己学习C ++

    3. **封装**:封装是面向对象的核心特性之一,它通过将数据和操作数据的方法结合在一起,隐藏实现细节,对外提供接口来实现数据的安全访问。 4. **继承**:继承允许一个类(子类)从另一个类(父类)继承属性和行为...

    c++学习的50条黄金定律

    - **解析**:C++是一种支持多种编程范式的语言,其中面向对象编程是最为重要的特性之一。学习类(class)、模板(template)、STL标准库以及泛型编程等概念,对于编写高质量的C++代码非常关键。 #### 7. 平衡理论与实践...

Global site tag (gtag.js) - Google Analytics