マーカー インターフェース パターン

フリー百科事典ウィキペディアより
ナビゲーションにジャンプ 検索にジャンプ

マーカー インターフェイス パターンは、コンピューター サイエンス設計パターンであり、オブジェクトに関する実行時の型情報を提供する言語で使用されます。これは、言語がそのようなメタデータを明示的にサポートしていないクラスにメタデータを関連付ける手段を提供します。

このパターンを使用するには、空のインターフェイスであるマーカー インターフェイス[1] (タグ付けインターフェイスとも呼ばれる) をクラスに実装し[2]、そのクラスのインスタンスと対話するメソッドがインターフェイスの存在をテストします。典型的なインターフェイスは、実装クラスがサポートする必要がある機能を (メソッド宣言の形式で) 指定しますが、マーカー インターフェイスはそうする必要はありません。このようなインターフェースが単に存在するということは、実装するクラスの一部に特定の動作があることを示しています。マーカーとして機能し、必要なメソッドを指定するハイブリッド インターフェイスは可能ですが、不適切に使用すると混乱を招く可能性があります。

Java プログラミング言語 からのマーカー インターフェースの適用例は次のSerializableインターフェースです。

パッケージ java.io ;

public インターフェイス Serializable  { 
}

クラスは、このインターフェイスを実装して、その非一時的なデータ メンバーを に書き込むことができることを示しObjectOutputStreamます。ObjectOutputStreamプライベート メソッドには、書き込み可能性を判断するためwriteObject0(Object,boolean)の一連のテストが含まれており、そのうちの 1 つはインターフェイスを探します。これらのテストのいずれかが失敗した場合、メソッドは. instanceofSerializableNotSerializableException

批評

マーカー インターフェイスの主な問題は、インターフェイスがクラスを実装するためのコントラクトを定義し、そのコントラクトがすべてのサブクラスに継承されることです。これは、マーカーを「実装解除」できないことを意味します。与えられた例では、シリアライズしたくないサブクラスを作成する場合 (おそらく一時的な状態に依存するため)、明示的にスローする必要があります(ドキュメント NotSerializableExceptionごと)。ObjectOutputStream

別の解決策は、言語がメタデータを直接 サポートすることです。

  • .NET FrameworkJava (Java 5 (1.5) 以降) の両方が、このようなメタデータをサポートしています。.NET では「カスタム属性」と呼ばれ、Java では注釈と呼ばれます。名前は異なりますが、概念的には同じものです。それらは、クラス、メンバー変数、メソッド、およびメソッド パラメーターで定義でき、リフレクションを使用してアクセスできます。
  • Pythonでは、「マーカー インターフェース」という用語はZopePloneで共通です。インターフェイスはメタデータとして宣言され、サブクラスはimplementsOnlyスーパークラスのすべてを実装していないことを宣言するために使用できます。

も参照

参考文献

  1. ^ ブロック、ジョシュア (2008). 「項目 37: マーカー インターフェイスを使用して型を定義する」 . 有効な Java (第 2 版)アディソン・ウェズリー。p。 179 . ISBN  978-0-321-35668-0.
  2. ^ "Java のマーカー インターフェイス" . GeeksforGeeks2017-03-06 . 2022 年5 月 1 日閲覧

さらに読む

Joshua Blochによる効果的な Java [1]

  1. ^ ブロック、ジョシュア (2018). 有効な Java (第 3 版)。ボストン。ISBN 978-0-13-468599-1. OCLC  1018432176