Effective Java 筆記(六)

來源:互聯網
上載者:User

相關讀書筆記列表

NO.15 要麼專門為繼承而設計,並給出文檔說明,要麼禁止繼承

 對並沒有文檔說明的類進行繼承是非常危險的,它的公有方法有可能被改變。在設計一個專門用來繼承的類時必須注意以下幾點(不適用於final類):

①必須精確地描述改寫每個方法帶來的影響,雖然這樣的描述違法了文檔格言“好的API文檔應該描述一個方法做了什麼工作,而不是描述它如何做”,但這也是繼承破壞了程式的封裝性而導致的。

②允許繼承的類的建構函式一定不能調用可被改寫的方法,無論是直接進行還是間接進行。因為超類的建構函式會在子類的建構函式之前運行,所以子類中改下版本的方法將會在子類的建構函式運行之前就被調用。如:

package com.ilibaba.test;<br />import java.util.*;<br />public class SubClass extends SuperClass {<br />private final Date date;<br />public SubClass() {<br />date = new Date();<br />}<br />public void m() {<br />System.out.println(date);<br />}<br />public static void main(String[] args) {<br />SubClass s = new SubClass();<br />s.m();<br />}<br />}<br />class SuperClass {<br />public SuperClass() {<br />m();<br />}<br />public void m() {<br />System.out.println("uuu");<br />}<br />}

“函數一定不能調用可被改寫的方法”的實現方式:把每個可改寫的方法的代碼體移到一個私人的“輔助方法”中,並且讓每個可改寫的方法調用他的私人輔助方法,然後用“直接調用可改寫方法的私人輔助方法”來代替“可改寫方法的每個自用調用”。

 在為了繼承而設計類的時候,不推薦實現Cloneable和Serializable介面。clone和readObject方法在行為上和建構函式相似——“一定不能調用可被改寫的方法,無論是直接進行還是間接進行”,對於readObject方法,子類中改寫版本的方法將子類的狀態被還原序列化之前運行,而對於clone方法,改寫版本的方法將在子類的clone方法有機會修正被複製對象的狀態之前被運行,無論哪種情形,它們都會不可避免的導致程式失敗。

 對於既不是final類,也不是為了子類化而設計和編寫文檔的普通類而言,防止出現問題的最好方法是禁止子類化,方法有兩種:

①把這個類聲明為final的。

②把所有的建構函式變成私人的,或者包級私人的,並增加一個公有的靜態Factory 方法來代替建構函式。

繼承的另一個替代方案就是利用封裝類模式,具體參見NO.14 複合優先於繼承

 

NO.16 介面優於抽象類別

介面和抽象類別的區別:

①抽象類別允許包含默寫方法的實現,而介面是不允許的;

②一個類要實現抽象類別,它必須成為抽象類別的一個子類,而實現介面的類只要定義了所要求的方法,並遵守通用的約定,不管這個類位於類層次的哪個地方;

介面可以構造出非層次結果的類型架構,比如一個介面可以繼承多個其他的介面。還可以安全地增加一個類的功能。

當然,也可以把介面和抽象類別的有點結合起來,對於你期望匯出的每一個總要的介面,頭提供一個抽象的骨架實作類別,這樣,介面的作用仍然是定義類型,骨架實作類別負責所以與介面實現相關的工作。

抽象類別也有明顯的優勢,它可以在一個類的後續的版本中方便的增加一個新的方法,但不影響到其他相關的類,而介面則做不到這一點。

總之,介面通常是定義具有多個實作類別型的最佳途徑(例外的情況:當演化的容易性比靈活性和功能更為重要的時候,應該使用抽象類別來定義類型,但也必須理解抽象類別的局限性,並確保可以接受這些局限性),如果已經匯出了一個重要的介面,那麼,也應該考慮同時提供一個骨架實作類別。最後,應該儘可能的謹慎設計所有的公有介面,並通過編寫多個實現來對它們進行全面的測試。

 

NO.17 介面只是被用於定義類型

介面只是用來定義一個類型,不要把介面用來做其他的事情(如在介面中定義常量,這種常量介面模式是對介面的不良使用)。

如果要匯出常量,可以有以下幾種方式:

①如果這些常量與某個已有的類或者介面有著緊密的聯絡,則可以把常量添加到這個類或者介面中。

②定義一個型別安全的枚舉類,把這些常量看做枚舉類型的成員。

③使用一個可以執行個體化的工具類(建構函式設為privat類型)來匯出這些常量。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.