Item 8: Obey the general contract when overriding equals

Item 8 ~ 12講了Methods Common to All Objects,Object類里面的一些不是final的方法。
這篇講的是override equals方法的時候要遵守的約定。

首先,如果不需要覆寫那是最好的,如果滿足了下面的條件就不需要覆寫:

不需要override的情況:

  • Each instance of the class is inherently unique
    比如Thread代表活動實體,而不是值(不懂)。
  • 不關(guān)心類是否提供「邏輯相等」的測試功能。
  • superclass已經(jīng)覆寫了equals。
  • 類是私有的,可以確定equals不會被調(diào)用。

需要覆寫的情況

如果類有自己的「邏輯相等」概念的話。比如String,不但要比對instance,還要比對每個char是否一致,instance一致自然是相等的(自反性reflexive),instance不相等,每個char相等,也返回true。

    public boolean equals(Object anObject) {
        if (this == anObject) {
            return true;
        }
        if (anObject instanceof String) {
            String anotherString = (String) anObject;
            int n = count;
            if (n == anotherString.count) {
                int i = 0;
                while (n-- != 0) {
                    if (charAt(i) != anotherString.charAt(i))
                            return false;
                    i++;
                }
                return true;
            }
        }
        return false;
    }

覆寫的時候需要遵守的general contract

  • reflexive
    x.equals(x) must be true
  • symmetric
    x.equals(y) must be the same as y.equals(x)
  • transitive
    x-->y-->z
  • consistent
    多次調(diào)用結(jié)果一致。
  • 非null類型的引用,x.equals(null)必須返回false

注意

這些contract看似很容易符合,但是文中對每個情形都舉了反例,告訴讀者這些條件是很容易不知不覺見違反的。具體可看文末鏈接。

當(dāng)完成編寫之后,要編寫單元測試來驗證上面的這些特性。

See also:
http://blog.csdn.net/partner4java/article/details/7066349

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理,服務(wù)發(fā)現(xiàn),斷路器,智...
    卡卡羅2017閱讀 136,715評論 19 139
  • 文章作者:Tyan博客:noahsnail.com | CSDN | 簡書 CHAPTER3 Method...
    SnailTyan閱讀 779評論 1 4
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法,類相關(guān)的語法,內(nèi)部類的語法,繼承相關(guān)的語法,異常的語法,線程的語...
    子非魚_t_閱讀 34,896評論 18 399
  • 對象的創(chuàng)建與銷毀 Item 1: 使用static工廠方法,而不是構(gòu)造函數(shù)創(chuàng)建對象:僅僅是創(chuàng)建對象的方法,并非Fa...
    孫小磊閱讀 2,186評論 0 3
  • 從三月份找實習(xí)到現(xiàn)在,面了一些公司,掛了不少,但最終還是拿到小米、百度、阿里、京東、新浪、CVTE、樂視家的研發(fā)崗...
    時芥藍(lán)閱讀 42,901評論 11 349

友情鏈接更多精彩內(nèi)容