6.7 メンバ・インタフェース
6.7.1 クラス内のインタフェース
メンバ・クラス同様に、インタフェースも何らかのクラスのメンバとして宣言することが可能です。これをメンバ・インタフェースと呼びます。トップレベルでの宣言と異なり、protected や private、static 修飾子を指定することができます。ただし、メンバ・クラスとは異なりメンバ・インタフェースは常に static です。明示的に static を指定することもできますが、省略しても暗黙的に static となるため、明示的な記述は意味を持ちません。メンバ・インタフェースは static メンバなので内部クラスには分類されません。
インタフェースの役割は実体を隠蔽しながら、型として実体への参照を公開することが目的です。そのパイプ役となるインタフェースを隠蔽することに意味はないため、通常、インタフェースをクラスのメンバとして囲んでしまう必要はありません。メンバ・インタフェースを用いるときは、内部クラスの関係が複雑化したときこれを統一して管理する方法などが考えられますが、そのようなケースは稀でしょう。
class Test { private interface IVisibility { void show(); } private class Child implements IVisibility { public void show() { System.out.println(toString() + " . show()"); } } public static void main(String args[]) { IVisibility obj = new Test() . new Child(); obj.show(); } }
>java Test Test$Kitty@5224ee . show()
コード1の Test クラスでは、メンバ・インタフェース IVisibility を宣言しています。内部クラス Child は IVisibility インタフェースを実装しているため、このクラスのオブジェクトは IVisibility 型に変換することができます。main() メソッドでは、Child クラスのインスタンスを生成し、IVisibility 型に変換した後 show() メソッドを呼び出しています。メンバ・インタフェースを囲んでいるクラス内では、このように単純名でアクセスすることができますが、外部のクラスからアクセスする場合は Test.IVisibility のように限定名で指定しなければなりません。もっとも、このプログラムの場合は private 修飾子を指定してインタフェースを外部から隠蔽しているため、外部からのアクセスは拒否されます。外部にインタフェースを公開するならば、あまりメンバ・インタフェースとして宣言する意味はありません。