Effective Javaを読んでいる㉒

staticメンバよりstaticでないメンバを選べ

enclosing class→内部クラスに対して外側のクラス

4つのネストされたクラス

static member classes

  • enclosing classのstaticなメンバである
  • enclosing classのすべてのメンバにアクセスできる。

nonstatic member classes

  • enclosing classのインスタンスに紐付いている。
  • enclosing classのインスタンス内にしか存在できない
  • 関係ないクラスから、あるクラスを別のインターフェースとして見せるのに使いがち(HashMapのEntrySetの実装とか.entrySet()の中で匿名クラスじゃダメなのか?実装量が多いからそうしてるだけ?)
  • 内部クラスがenclosing classに対して完全に依存してる時だけこれを使うべき?
  • 内部クラスがenclosing instanceに対して依存していなくても、内部クラス→enclosing instanceの参照を持つので内部クラスへの参照が生きているとenclosing instanceへのGCが行われない(HashMapのEntryがnonstatic member classesだとEntryだけの参照が残っているのにMapがGCされない)

anonymouse classes

  • 名前が無い
  • 宣言されるコンテキストにあわせてどこから見えるのか変わる
  • 宣言された場所でしかインスタンス化できない
  • instanceofが使えない(名前がないから)
  • 複数のインターフェースを実装できない
  • クラスを継承しつつインターフェースを実装できない
  • 新たに定義したメソッドを呼べない(名前がないから)

local classes

  • メソッドの中で宣言されるやつ
  • ローカル変数が宣言できる場所なら宣言できる。スコープも同じ