`
sam406
  • 浏览: 57703 次
  • 性别: 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 方法,则不一定产生不同的整数结果。但是程序员应该知道,给不相等的对象产生截然不同的整数结果,有可能提高散列函数的性能。
   
   
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics