Effective Java Item 22 note

Favor static member classes over nonstatic

Arwii
mycodingjourney
3 min readJun 28, 2018

--

Nested class:

  1. 為了服務outer class
  2. 如果有使用到別人的用途的話,也為了增加封裝(encapsulation)
  3. 如果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:

沒有名字,只在使用的時候被實例化。有三種常用方式:

  1. function object (應該可以被lambda取代)
  2. 創建process object, ex:thread, runnable等
  3. Static factory建立的時候使用

可以用在已經有一個preexisting type來代表這個class了,這個class也屬於這個method,就可以使用這個寫法。

  • Local class:

比較少這樣用,可以放在變數宣告的時候,有名字,可以重複使用。盡量用在單一method內。

--

--

Arwii
mycodingjourney

Try not to become a man of success, but rather try to become a man of value — A. Einstein