りんごとバナナとエンジニア

エンジニア修行の記録

【Java】Nested Classの使いどころ

Javaで特定のクラスに強く紐づく小さなクラスがあるとき、それをネストさせている書き方と、ネストさせずに1ファイル内に並列して置く書き方の両方をよくみる。どちらを使うと良いのか迷うことが多かったので、Effective Javaの項目24にあたってみた。

www.amazon.co.jp

まず、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されると、エンクロージングクラスのオブジェクトが残ってしまいメモリリークを起こしうる。