Javaのマーカーインターフェイスを知っています。これは、クラスに関する特定の動作を定義するために使用されます。たとえば、Serializableインターフェイスには、オブジェクトをバイトストリームに格納する特定の機能とその逆のプロセスがあります。ただし、この特定の動作が実装されている場所はわかりません。メソッドが含まれていないためです。
この問題を解決するために私を案内してください。
シリアル化は、ObjectInputStream
およびObjectOutputStream
クラスによって処理されます。クラスに特別なシリアル化のニーズがある場合、作成するメソッドの概要は [〜#〜] api [〜#〜] に記載されています。リフレクションは、これらのメソッドを呼び出すために使用されます。
他のインターフェースを作成するのと同じ方法です。
マーカーインターフェイスにメソッドを配置することを妨げるものは何もありません。
現在、より一般的な方法は、 annotations を使用して、インターフェースが提供するのと同じメタデータマーカーインターフェースを提供することです。
ObjectOutputStream
およびObjectInputStream
は、クラスがSerializable
、Externalizable
を実装しているかどうかをチェックします。はいの場合は続行するか、そうでない場合はNonSerializableException
がスローされます。
メソッドなしでインターフェースを作成します。これがマーカーインターフェースです。
サンプル
public interface IMarkerEntity {
}
このインターフェイスを実装するクラスがアプリケーションによってデータベースエンティティとして取得される場合。
サンプルコード:
public boolean save(Object object) throws InvalidEntityException {
if(!(object instanceof IMarkerEntity)) {
throw new InvalidEntityException("Invalid Entity Found, cannot proceed);
}
database.save(object);
}
Marker Interface Pattern の全体的なアイデアは、「はい、私は何かです」と言う手段を提供することであり、システムがデフォルトのプロセスを続行します。たとえば、クラスをSerialzableとしてマークすると、これはクラスはバイトに変換できます。
はい独自のマーカーインターフェイスを作成できます。次を参照してください...
interface Marker{
}
class MyException extends Exception {
public MyException(String s){
super(s);
}
}
class A {
void m1() throws MyException{
if((this instanceof Marker)){
System.out.println("successfull");
}
else {
throw new MyException("Must implement interface Marker ");
}
}
}
public class CustomMarkerInterfaceExample extends A implements Marker
{ // if this class will not implement Marker, throw exception
public static void main(String[] args) {
CustomMarkerInterfaceExample a= new CustomMarkerInterfaceExample();
try {
a.m1();
} catch (MyException e) {
System.out.println(e);
}
}
}
マーカーインターフェイスにはメソッドがありません。 Javaには、JVMが理解できるSerializable
、Clonable
&EventListner
などのマーカーインターフェイスが組み込まれています。
独自のマーカーインターフェイスを作成できますが、JVMとは関係ありません。instanceOf
を使用していくつかのチェックを追加できます。
空のインターフェースを作成する
interface Marker{ }
クラスを作成してインターフェースを実装する
class A implements Marker {
//do some task
}
Main
クラスでマーカーインターフェイスをチェックinstanceof
class Main {
public static void main(String[] args) {
A ob = new A(){
if (ob instanceof A) {
// do some task
}
}
}
ウィキペディアの記事 マーカーインターフェイスパターン で非常にうまく説明されているように、マーカーインターフェイスはメタデータの形式です。クライアントコードは、オブジェクトがマーカーインターフェイスのインスタンスであるかどうかをテストし、それに応じて(クライアントの)動作を適応させることができます。これがマーカーインターフェイスです。
public interface CoolObject {
}
次に、コードはオブジェクトがCoolObject
であるかどうかをテストし、それを使って何かを行うことができます。
if (anObject instanceof CoolObject) {
addToCoolList((CoolObject) anObject);
}
Serializable
インターフェースは、Java言語の一部として定義されています。そのレベルでの動作を自分で実装することはできません。
マーカーインターフェイスにメソッドを追加することはできますが、マーカーパターンと他のインターフェイスの概念的な用途が混在しており、混乱する可能性があります。 (クラスは、それをマークするため、またはその動作のため、あるいはその両方のためにインターフェースを実装していますか?)
ウィキペディアの記事で説明されているように、Javaのマーカーインターフェイスは annotations で置き換えることができます(おそらくそうする必要があります)。
私の知る限り、マーカーインターフェイスは「ユーティリティ」クラスによって動作を取得します。たとえば、Gang of Fourのデザインパターンブックを読んだ場合、別のクラスで定義されたマーカーインターフェイスでタグ付けされたクラスの動作があります。
たとえば、マーカーインターフェイス「保存可能」があります。このインターフェイスを実装するすべてのクラスを(リフレクションを介して)トラバースし、その上で操作を保存するプロセスがあります。