ネストされたインターフェース(inner interfaces)とは、他のクラスやインターフェースの内部で宣言されたインターフェースのことです。これは、大規模なクラスを構造化し、実装の詳細を隠すために言語に初めて導入されました。このようなカプセル化により、契約を論理的にグループ化でき、コードの可読性と保守性が大幅に向上します。
Javaの初期バージョンから、クラスや他のインターフェースの内部に静的および非静的なネストされたインターフェースを宣言する機能がありました。この実践は、大規模なライブラリ(例えば、Javaのコレクション)で広まりました。
ネストされたインターフェースの可視性や使用範囲の誤解は、API設計のエラーやアプリケーションアーキテクチャの複雑化を引き起こすことがよくあります。これらはインスタンスメンバーとして使用できず、常に静的であるため注意が必要です。
ネストされたインターフェースは、よりモジュール化された構造を与え、ラッパークラスにのみ関連する特定の契約を際立たせるために使用されます。例えば、Map内のEntryインターフェース:
public interface Map<K, V> { interface Entry<K, V> { K getKey(); V getValue(); } Set<Entry<K, V>> entrySet(); }
主な特徴:
質問 1: 外部クラスのインスタンスがなくてもネストされたインターフェースのインスタンスを作成できますか?
はい、ネストされたインターフェースのインスタンスは、外部オブジェクトを作成せずに別々に実装できます。なぜなら、インターフェースは静的にネストされているからです。
質問 2: クラス内でのネストされたインターフェースの可視性はどうなりますか?
可視性は修飾子(public, protected, private, package-private)によって制御されます。しかし、外部からのアクセスが必要な場合は、一般にpublicにします。
質問 3: ネストされたインターフェースはネストされたインターフェースを含むことができますか?
はい、インターフェースのネストの深さに制限はありませんが、可読性の低下のため、実際にはあまり見られません。
ある大規模プロジェクトで、Serviceクラス内に10以上のネストされたインターフェースが定義されました。関係の数が増え、コードのナビゲーションと理解が悪化しました。
利点:
欠点:
DataProcessorクラス内にネストされたインターフェースValidatorが定義され、DataProcessor内でのみ実装されました。
利点:
欠点: