Effective Java Item 22 note
Favor static member classes over nonstatic
Nested class:
- 為了服務outer class
- 如果有使用到別人的用途的話,也為了增加封裝(encapsulation)
- 如果nested class會被其他class給使用到,那該class應該就是個top-level class。
class OuterClass {
private int test1 = 10;
static class StaticNestedClass {
//使用上除非outer class的member是static的,不然也是要有instance才可以使用。不過任何permission都可以看得到。
}
class InnerClass {
//使用上是跟著outer class的instance的,permission也都看得到,這也就代表,每個inner class的instance都會reference到outer class的instance,使用上要小心,避免mem leak。
}
}
有四種nested class:
- Static member class:
可當成Outer class的static member,其被存取的權限就看enclosing怎麼宣告。一個常見的用法是當作public的輔助類,跟outer class一起作用。Non static member class的不同做法,outer class不需要每個都一份instance的時候可以使用,可以節省resource開銷。
可以參考HashMap裡面的
static class Node<K,V> implements Map.Entry<K,V>就是個避免每個entry都要有個instance的做法。
=================inner class=================
底下的用法都不能獨立於outer class獨自存在。可以看成是一種adpter的概念,讓outer class可以跟其互動,最好內部的程式碼不多,以免影響可讀性。
- Non static member class:
會被多個method使用到,而且每個instance都會需要使用到outer class的instance,就可以考慮使用。
- Anonymous class:
沒有名字,只在使用的時候被實例化。有三種常用方式:
- function object (應該可以被lambda取代)
- 創建process object, ex:thread, runnable等
- Static factory建立的時候使用
可以用在已經有一個preexisting type來代表這個class了,這個class也屬於這個method,就可以使用這個寫法。
- Local class:
比較少這樣用,可以放在變數宣告的時候,有名字,可以重複使用。盡量用在單一method內。