Akira's Blog

神奈川在住のITエンジニアの雑記です。主にプログラミング(Perl, Java など)やネットワーク技術についての小ネタを、ちょっとずつ書いていきます。

staticな内部クラス

Javaではクラスの中にクラスを定義することができる。これを内部クラスと言う。この内部クラスを定義する際、staticを付けることができる。今日はどういう時に内部クラスにstaticを付けるべきなのか書く。

結論から言ってしまうと、内部クラスにはstaticを付けるべき、ということになる。名著「Effective Java」にもそう書いてあるらしい。以下、その理由について述べる。

 

内部クラスにstaticを付けると、内部クラスから外部クラス(エンクロージングクラスとも言う)のフィールド変数にアクセスできなくなる。これは、言い換えると、外部クラスのフィールド変数のスコープが (staticなしの内部クラスの場合と比べて) 小さくなるということである。プログラミングの定石として変数のスコープはできるだけ小さくすべきなので、これは利点である。

「それじゃあ、内部クラスから外部クラスのフィールド変数にアクセスしたい場合に対応できないよ!」という反論もあるかもしれないが、それは外部クラスと内部クラスが相互に参照し合っている(結合度が強い)ということになるため、クラス設計を見直した方が良いかもしれない。

他にstaticな内部クラスとstaticなしの内部クラスとで大した機能差はないので、内部クラスにはstaticを付けるべき、ということになる。

 

ちなみに、staticなものからstaticでないものにアクセスできないのは内部クラスに限った話ではなく、例えば、staticなメソッド内からはフィールド変数にアクセスできない。これは、staticなメソッドはクラスの持ち物であり、フィールド変数はクラスから生成されたインスタンスの持ち物であり、インスタンスは複数存在することがあるので、staticなメソッドからどのインスタンスのものを参照すれば良いのか分からないためである(と理解している)。