《EffctiveJava》對於全部對象都通用的方法

對於全部對象都通用的方法

覆蓋equals

  • 不覆蓋equals方法,每一個類只與他自己相等

何時應該覆蓋equals方法呢?web

  • 類具備本身的 「邏輯相等」,一般屬於「值類(value class)」,例如Integer和Date,必須覆蓋equals方法,並且能夠用做映射表(map)的鍵(key),或者集合(set)的元素。
  • 有一種「值類」不須要覆蓋equals方法,即用實例受控確保「每一個值至多隻存在一個對象」的類。例如枚舉,對於這樣的類,邏輯相同與對象相同是一回事,所以Object的equals方法等同於邏輯意義上的equals方法。

覆蓋equals須要注意哪些約定?ide

  • 自反性(reflexive):if x != null ,x.equals(x) == true;
  • 對稱性(symmetric):x.equals(y) == y.equals(x)
  • 傳遞性(transitive):x.equals(y), y.equals(z), 則 x.equals(z)
  • 一致性(consistent):屢次調用x.equals(y),結果都同樣
  • 非空性(Non-Nullity):對於任何非null的值調用x.equals(null) 結果爲false

高質量的equals訣竅:svg

  • 使用==操做符檢查「參數是否爲這個對象的引用」。若是是,則返回true。
  • 使用instanceof檢查「參數是否爲正確的類型」。若是不是,則返回爲false。
  • 把參數轉成正確的類型。由於轉換以前用instanceof測試,確保會成功。
  • 對於該類中的關鍵域,檢查參數中的域與該對象中對應的域相匹配。
  • 編寫完equals,檢查是否遵循對稱,傳遞,一致性。

告誡:測試

  • 覆蓋equals總要覆蓋hashCode(hashCode的通用約定)
  • 不要讓equals過於智能(複雜)
  • 不要將equals聲明中的Object對象替換爲其餘的類型。
public boolean equals(Object o) {
	...
}
// 而不是
public boolean equals(MyObject o) {
	...
}

覆蓋equals方法總要覆蓋hashCode

覆蓋equals方法時不覆蓋hashCode,就會違反hashCode的通用約定,從而致使該類沒法結合全部基於散列的集合一塊兒正常運做,這樣的集合包括HashMap、HashSet和HashTable。flex

始終要覆蓋toString

建議全部的子類都覆蓋這個方法。code

考慮重寫comparable接口

public class Person implements Comparable {

    private String name;

    private int age;

    @Override
    public String toString() {
        return "Person{" +
                "name='" + name + '\'' +
                ", age=" + age +
                '}';
    }
    public int compareTo(Object o) {
        if (o instanceof Person) {
            Person o1 = (Person) o;
            return o1.getName().compareTo(name) > 0 ? 1 : (o1.getName().compareTo(name) == 0 ? 0 : -1);
        }
        return 0;
    }

    public static void main(String[] args) {
        List<Person> peoples = new ArrayList<Person>(
                Arrays.asList(
                        new Person("a", 1),
                        new Person("b", 2),
                        new Person("a", 1),
                        new Person("d", 3),
                        new Person("f", 5))
        );
        Collections.sort(peoples);
        peoples.forEach(people -> System.out.println(people));

    }
}

輸出
在這裏插入圖片描述xml

相關文章
相關標籤/搜索