マーカーインターフェースパターンは、コンピュータサイエンスにおけるデザインパターンの一つで、オブジェクトに関する実行時型情報を提供する言語で使用されます。このパターンは、言語がそのようなメタデータを明示的にサポートしていない場合でも、クラスにメタデータを関連付ける手段を提供します。
このパターンを使用するには、クラスはマーカーインターフェース[ 1 ](タグ付けインターフェースとも呼ばれる)を実装します。これは空のインターフェース[ 2 ]であり、そのクラスのインスタンスとやり取りするメソッドは、インターフェースの存在をテストします。一般的なインターフェースは、実装クラスがサポートしなければならない機能(メソッド宣言の形式)を指定しますが、マーカーインターフェースはそうする必要はありません。このようなインターフェースが存在するだけで、実装クラスの特定の動作が示されます。マーカーとして機能し、必要なメソッドを指定するハイブリッドインターフェースも可能ですが、不適切に使用すると混乱を招く可能性があります。
Javaプログラミング言語 のマーカーインターフェースの応用例として、以下のSerializableインターフェースが挙げられます。
パッケージjava.io ;public interface Serializable { }クラスはこのインターフェースを実装することで、その非一時的なデータメンバーがに書き込めることを示しますObjectOutputStream。ObjectOutputStreamプライベートメソッドには書き込み可能性を判断するためのwriteObject0(Object,boolean)一連のinstanceofテストが含まれており、そのうちの1つはインターフェースを探しますSerializable。これらのテストのいずれかが失敗した場合、メソッドは例外をスローしますNotSerializableException。
マーカーインターフェースの問題点の1つは、インターフェースが実装クラスの契約を定義し、その契約がすべてのサブクラスに継承されるため、マーカーを「実装解除」できないことです。上記の例では、シリアル化を意図していないサブクラス(おそらく一時的な状態に依存しているクラス)は、明示的に NotSerializableException 例外をスローする必要があります(ObjectOutputStreamドキュメント参照)。
別の解決策としては、言語自体がメタデータを直接サポートすることが挙げられる。
implementsOnlyスーパークラスのすべての機能を実装するわけではないことを宣言できます。ジョシュア・ブロック著『効果的なJava』[ 1 ]