マーカーインターフェイス パターンは、コンピュータ サイエンスにおけるデザイン パターンであり、オブジェクトに関する実行時の型情報を提供する言語で使用されます。このパターンは、言語がそのようなメタデータを明示的にサポートしていない場合に、メタデータをクラスに関連付ける手段を提供します。
このパターンを使用するには、クラスが空のインターフェースであるマーカーインターフェース[1] (タグ付けインターフェースとも呼ばれる)を実装し[2]、そのクラスのインスタンスとやりとりするメソッドがインターフェースの存在をテストします。一般的なインターフェースは実装クラスがサポートしなければならない機能を (メソッド宣言の形式で) 指定しますが、マーカーインターフェースはそうする必要はありません。このようなインターフェースが存在するだけで、実装クラスの特定の動作が示されます。マーカーとして機能し、必要なメソッドも指定するハイブリッドインターフェースは可能ですが、不適切に使用すると混乱を招く可能性があります。
例
Java プログラミング言語
のマーカー インターフェイスのアプリケーションの例は次のインターフェイスですSerializable。
パッケージjava.io ;
パブリックインターフェースSerializable { }
クラスはこのインターフェースを実装して、その非一時データ メンバーが に書き込めることを示しますObjectOutputStream。ObjectOutputStreamプライベート メソッドには、書き込み可能性を判定するwriteObject0(Object,boolean)一連のinstanceofテストが含まれており、そのうちの 1 つはインターフェースを検索しますSerializable。これらのテストのいずれかが失敗すると、メソッドは をスローしますNotSerializableException。
批評
マーカー インターフェースの主な問題は、インターフェースがクラスの実装に関する契約を定義し、その契約がすべてのサブクラスに継承されることです。つまり、マーカーを「実装解除」することはできません。上記の例では、シリアル化したくないサブクラスを作成する場合 (一時的な状態に依存しているためなど)、明示的にスローする必要があります(ドキュメント
NotSerializableExceptionによる)。ObjectOutputStream
もう 1 つの解決策は、言語でメタデータを直接サポートすることです。
- .NET FrameworkとJava (Java 5 (1.5) 以降) はどちらも、このようなメタデータをサポートしています。.NET では「カスタム属性」と呼ばれ、Java では「注釈」と呼ばれます。名前は異なりますが、概念的には同じものです。クラス、メンバー変数、メソッド、メソッド パラメータに定義でき、リフレクションを使用してアクセスできます。
- Pythonでは、「マーカー インターフェース」という用語はZopeとPloneでよく使用されます。インターフェースはメタデータとして宣言され、サブクラスはそれを使用して、
implementsOnlyスーパークラスのすべてを実装していないことを宣言できます。
参照
- このパターンを拡張するためのデザインマーカー。
参考文献
- ^ Bloch, Joshua (2008). 「項目 37: マーカー インターフェースを使用して型を定義する」 . Effective Java (第 2 版). Addison-Wesley. p. 179. ISBN 978-0-321-35668-0。
- ^ 「Java のマーカー インターフェース」。GeeksforGeeks。2017年 3 月 6 日。2022年 5 月 1 日閲覧。
さらに読む
ジョシュア・ブロック著『Effective Java』[1 ]
