1. 程式人生 > >《Effective Java》第4章 類和介面

《Effective Java》第4章 類和介面

  • 優先考慮靜態成員類【Item 22】
    1)巢狀類(nested class)是指被定義在一個類的內部的類,它的目的是為其外圍類(enclosing class)提供服務
    2)巢狀類有靜態成員類、非靜態成員類、匿名類、區域性類四種,其中靜態成員類為非內部類,其無異於外圍類,僅僅是位置位於外圍類內部,即使沒有外圍類的例項,靜態成員類仍可以被正常使用,其它三種被成為內部類
    3)靜態成員類一種常見用法是作為公有的輔助類,僅當與它的外部類一起使用才有意義
    4)非靜態成員類的每個例項都隱含著與外圍類的一個外圍例項相關聯,沒有外圍類的例項的情況下,要想建立非靜態成員類的例項是不可能的
    5)非靜態成員類的一種常見用法是定義一個Adapter,它允許外部類的例項被看作是另一個不相關的類的例項
    6)如果宣告成員類不要求訪問外圍類例項,就要始終把static修飾符放在它的宣告中,使它成為靜態成員類,而不是非靜態成員類,如果缺省了static修飾,那麼其巢狀類的每個例項都包含一個外圍類的例項,儲存這份引用需要時間和空間,並且導致外圍例項在垃圾回收時得以保留
    7)私有靜態成員類的一種常見用法是用來代表外圍類所代表的元件
    8)當且僅當匿名類出現在非靜態環境中時,它才有外圍例項,但是即使它們出現在靜態環境中,也不可能擁有任何靜態成員
    9)匿名類常見用法
    a.動態的建立函式物件,也就是策略物件
    b.建立過程物件,比如runnable,Thread或者TimerTask等
    c.靜態工廠方法的內部進行匿名自定義類物件的建立
    10)匿名類的限制
    a.除了在匿名類宣告的時候,是無法將它們例項化的,你不能執行instanceof測試,或者做任何需要命名類的其它事情
    b.無法宣告一個匿名類來實現多個介面,或者擴充套件一個類,並同時擴充套件類和實現介面
    c.匿名類的客戶端無法呼叫任何成員,除了從它的超類中繼承得到之外
    d.由於匿名類出現在表示式中,其必須保持簡短
    11)在任何宣告區域性變數的地方都可以宣告區域性類,並且區域性類也遵守同樣的作用域規則
    12)區域性類同其它三種巢狀類都有一些共同屬性
    a.與成員類一樣,區域性類有名字,可以被重複地使用
    b.與匿名類一樣,只有當局部類在非靜態環境中定義的時候,才有外圍例項,它們不能包含靜態成員
    c.與匿名類一樣,它必須非常簡短,以便不會影響到可讀性
    13)四種巢狀類的用法:
    a.如果一個巢狀類需要在單個方法之外仍然是可見的,或者它太長了,不適合於放在方法內部,就應該使用成員類
    b.如果巢狀類的每個例項都需要一個指向其外圍類例項的引用,就要把成員類做成非靜態的,否則做成靜態的
    c.假設這個巢狀類屬於一個方法內部,如果你只需要在一個地方建立該類的例項,並且已經有了一個預置型別可以說明這個類的特徵,那麼將其做成匿名類
    d.以上特徵都沒有,那麼就可以將巢狀類設計成區域性類