嵌套類 (nested class) 是定義於一個類中的內部類,而用途只為其外圍類 (enclosing class) 而存在。嵌套類有 4 種,除第 1 種外,後面 3 種稱作內部類 (inner class)。
- static member classes (靜態成員類)
- nonstatic member classes (非靜態成員類)
- anonymous classes (匿名類)
- local classes (局部類)
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,像是 keySet、entrySet 及 values。HashMap 中的 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),像是 Thread 及 Runnable 等等。匿名類有幾項限制,像是沒有名稱、不能執行 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://cookieandcoketw.blogspot.com/2020/07/effective-java-24-static-member-class.html
https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html
Local class
https://docs.oracle.com/javase/tutorial/java/javaOO/localclasses.html
沒有留言:
張貼留言