zoukankan      html  css  js  c++  java
  • 《Effective Java》—— 对于所有对象都通用的方法

    本节主要涉及Object中通用的一些方法,比如equals,hashCode,toString,clone,finalize等等

    覆盖equals时请遵守通用约定

    equals方法实现的等价关系:

    • 自反性:对于所有的非null,a=a
    • 对称性:a=b,则b=a
    • 传递性:a=b,b=c,则a=c
    • 一致性:对于没有被修改的ab,如果a=b,则一直a=b
    • 非空性:对于任何非Null,a!=null

    高质量equals方法的诀窍:

    • 使用==操作符检查——“参数是否为这个对象的引用”
    • 使用instanceof检查——“参数是否为正确的类型”
    • 参数转换成正确的类型
    • 对于每个关键域,检查参数中的域是否与对象的域相匹配
    • 写完后,问自己:是否对称、是否传递、是否一致

    忠告:

    • 覆盖equlas时,总是覆盖hashCode
    • 不要企图让equals过于智能
    • 不要将equals中的Object对象换成其他的类型
    @Override public boolean equals(Object o){
        if(o == this)
            return true;
        if(!(o instanceof XX))
            return false;
        XX xx = (XX)o;
        return xx.x.equals(o.x);//TODO
    }
    

    覆盖equals时总是要覆盖hashCode

    hashCode主要用于放在HashMap,HashSet,HashTable中时,计算hash值。

    @Override public int hashCode(){
        int result = 17;
        result = 31*result+eee;
        result = 31*result+xxx;
        return result;
    }
    

    其中17是随便写的,31是有说道的,因为31是个奇素数,并且:

    31*i==(i<<5)-i
    

    这样JVM在优化的时候效率会更高。

    始终覆盖toString()

    因为toString方法应该返回对象的关键信息

    谨慎的覆盖clone

    应该满足:

    x.clone() != x
    x.clone().getClass() == x.getClass()
    x.clone().equals(x)
    

    另外clone方法相当于另一种构建器,不应该对原来的对象产生影响。

    考虑实现Comparable接口

    常用的List等等可以通过实现Comparable接口进行排序:

    public interface Comparable<T{
        int compareTo(T t);
    }
    

    当对象小于,等于或者大于时,应该返回一个负整数,零或者正整数。

  • 相关阅读:
    【关键字】
    【选择结构语句:switch】
    【数据类型】
    【接口】
    【抽象类和接口的区别】
    【访问权限】
    【内部类】
    【方法】
    【this 关键字】
    【Static】
  • 原文地址:https://www.cnblogs.com/xing901022/p/5913813.html
Copyright © 2011-2022 走看看