web-dev-qa-db-ja.com

Javaで独自のマーカーインターフェイスを作成する方法

Javaのマーカーインターフェイスを知っています。これは、クラスに関する特定の動作を定義するために使用されます。たとえば、Serializableインターフェイスには、オブジェクトをバイトストリームに格納する特定の機能とその逆のプロセスがあります。ただし、この特定の動作が実装されている場所はわかりません。メソッドが含まれていないためです。

  1. JVMはこの特定の動作をどのように呼び出しますか?
  2. 独自のマーカーインターフェイスを作成する方法私が理解できるように、簡単なユーザー定義のマーカーインターフェイスを提供してくれませんか?
  3. マーカーインターフェイスにメソッドを含めることはできますか?

この問題を解決するために私を案内してください。

15
Saravanan
  1. シリアル化は、ObjectInputStreamおよびObjectOutputStreamクラスによって処理されます。クラスに特別なシリアル化のニーズがある場合、作成するメソッドの概要は [〜#〜] api [〜#〜] に記載されています。リフレクションは、これらのメソッドを呼び出すために使用されます。

  2. 他のインターフェースを作成するのと同じ方法です。

  3. マーカーインターフェイスにメソッドを配置することを妨げるものは何もありません。

現在、より一般的な方法は、 annotations を使用して、インターフェースが提供するのと同じメタデータマーカーインターフェースを提供することです。

14
Jeffrey
  • JVMがこの特定の動作を呼び出す方法

ObjectOutputStreamおよびObjectInputStreamは、クラスがSerializableExternalizableを実装しているかどうかをチェックします。はいの場合は続行するか、そうでない場合は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としてマークすると、これはクラスはバイトに変換できます。

28
mprabhat

はい独自のマーカーインターフェイスを作成できます。次を参照してください...

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);
        }


    }

}
5
Vijay Bhatt

マーカーインターフェイスにはメソッドがありません。 Javaには、JVMが理解できるSerializableClonableEventListnerなどのマーカーインターフェイスが組み込まれています。

独自のマーカーインターフェイスを作成できますが、JVMとは関係ありません。instanceOfを使用していくつかのチェックを追加できます。

  1. 空のインターフェースを作成する

    interface Marker{    }
    
  2. クラスを作成してインターフェースを実装する

    class A implements Marker {
        //do some task
    }
    
  3. Mainクラスでマーカーインターフェイスをチェックinstanceof

    class Main {
        public static void main(String[] args) {
            A ob = new A(){
            if (ob instanceof A) {
                // do some task
            }
        }
    }
    
3
Panky031

ウィキペディアの記事 マーカーインターフェイスパターン で非常にうまく説明されているように、マーカーインターフェイスはメタデータの形式です。クライアントコードは、オブジェクトがマーカーインターフェイスのインスタンスであるかどうかをテストし、それに応じて(クライアントの)動作を適応させることができます。これがマーカーインターフェイスです。

public interface CoolObject {
}

次に、コードはオブジェクトがCoolObjectであるかどうかをテストし、それを使って何かを行うことができます。

if (anObject instanceof CoolObject) {
    addToCoolList((CoolObject) anObject);
}

Serializableインターフェースは、Java言語の一部として定義されています。そのレベルでの動作を自分で実装することはできません。

マーカーインターフェイスにメソッドを追加することはできますが、マーカーパターンと他のインターフェイスの概念的な用途が混在しており、混乱する可能性があります。 (クラスは、それをマークするため、またはその動作のため、あるいはその両方のためにインターフェースを実装していますか?)

ウィキペディアの記事で説明されているように、Javaのマーカーインターフェイスは annotations で置き換えることができます(おそらくそうする必要があります)。

2
Ted Hopp

私の知る限り、マーカーインターフェイスは「ユーティリティ」クラスによって動作を取得します。たとえば、Gang of Fourのデザインパターンブックを読んだ場合、別のクラスで定義されたマーカーインターフェイスでタグ付けされたクラスの動作があります。

たとえば、マーカーインターフェイス「保存可能」があります。このインターフェイスを実装するすべてのクラスを(リフレクションを介して)トラバースし、その上で操作を保存するプロセスがあります。

0
matcauthon