2020/07/29

[筆記] Effective Java #24 靜態成員類優於非靜態成員類

Effective Java 3rd 簡體中文版筆記 #24 靜態成員類優於非靜態成員類
嵌套類 (nested class) 是定義於一個類中的內部類,而用途只為其外圍類 (enclosing class) 而存在。嵌套類有 4 種,除第 1 種外,後面 3 種稱作內部類 (inner class)
  1. static member classes (靜態成員類)
  2. nonstatic member classes (非靜態成員類)
  3. anonymous classes (匿名類)
  4. local classes (局部類)
靜態成員類 (static member class) 視為普通的 class,只是剛好宣告在內部,可以訪問其外圍類的全部成員,如果該 class 為 private,那就只有外圍類可以訪問它。靜態成員類大多為輔助外圍類 用的,以下為範例。
public class StaticClassExample {
    public Car getCarDescription(String id) {
        return new Car(id);
    }

    static class Car {
        String id;
        String brand;
        String color;

        Car(String id, String brand, String color) {
            this.id = id;
            this.brand = brand;
            this.color = color;
        }
    }
}
非靜態成員類 (nonstatic member class) 必與其外圍類有一定的關聯性,如果該非靜態成員類的實體會在其外圍類實體不存在時單獨存在,那麼該類就不適合作為非靜態成員類,合理情況為外圍類不存在時,非靜態成員類是不會獨自存在的。非靜態成員類與其外圍類之關係會在實體生成時就建立,而且無法修改。
常見的用法為定義 Adapter,像是 Map 實作會用非靜態成員類來完成 collection view,像是 keySetentrySetvaluesHashMap 中的 KeySet 類就是非靜態成員類,因為它還是依賴於 HashMap 的 field 及方法。
final class KeySet extends AbstractSet<K> {
    public final int size()        { return size; }    // HashMap.size
    public final void clear()      { HashMap.this.clear(); }
    ...
}
匿名類 (anonymous class) 在同一時間宣告及生成,在 Java 提出 Lambda 前,最常見的用途是創建函式物件 (function object) 和過程物件 (process object),像是 ThreadRunnable 等等。匿名類有幾項限制,像是沒有名稱、不能執行 instanceof、無法實作多個介面或是繼承一個類。
new Thread(new Runnable(){
    @Override
    public void run() {
        for(int i = 0; i < 100; i++) {
            System.out.println(i);
        }
    }
},"thread").run();
局部類 (local class) 是最少使用的,局部類僅能訪問外圍類的 final field。
public class SomeClass {
    public void something() {
        class LocalClass {
            public void print() {
                System.out.println("LocalClass");
            }
        }
        LocalClass example = new LocalClass();
        example.print();
    }
}
該選擇什麼型態的類? 如果需要引用外圍類那麼請用非靜態成員類,否則設為靜態成員類。如果只有在一段程式碼生成實體且已有一存在的型態來描述該類,那麼用匿名類,否則用局部類。
Anonymous class
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
Local class
https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
轉載請註明原文網址 https://cookieandcoketw.blogspot.com/2020/07/effective-java-24-static-member-class.html

沒有留言:

張貼留言