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
- メソッドの中で宣言されるやつ
- ローカル変数が宣言できる場所なら宣言できる。スコープも同じ