【Java】Nested Classの使いどころ
Javaで特定のクラスに強く紐づく小さなクラスがあるとき、それをネストさせている書き方と、ネストさせずに1ファイル内に並列して置く書き方の両方をよくみる。どちらを使うと良いのか迷うことが多かったので、Effective Javaの項目24にあたってみた。
まず、Nested Classには2種類ある。
- non-static nested class: 自身のインスタンスの中から、外部クラスの全フィールドにアクセス可能
- static nested class: 外部クラスのフィールドにはアクセスできない
このうちnon-static nested classの場合、自身をネストしているクラスのフィールドがたとえprivateであっても、そのフィールドにアクセス可能になる。
これをふまえると、Nested Classを宣言するときは、そのクラスがネストされているエンクロージングクラスからのみ使われ、かつ1メソッドとするには少し長すぎるという場合が良い。それが小さなクラスであれば、ネストさせた方が関係性が見えやすくなり、可読性も上がる。さらに、
では、non-static nested classとstatic nested classはどう使い分ければ良いだろうか。Nested classから見て、もしエンクロージングクラスのインスタンスやフィールドにアクセスすることがある場合、non-static nested classを使っても良い。non-static nested classを使う場合、Nested Classから使われているフィールドをprivateにでき、クラスのカプセル化を促進することができる。
しかし、エンクロージングクラスにアクセスすることが全く無い場合は、static nested classを使うことが推奨されている。non-static nested classの場合、エンクロージングクラスのオブジェクトと参照関係を持つので、それが全く使われずGCされると、エンクロージングクラスのオブジェクトが残ってしまいメモリリークを起こしうる。