19

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

  1. JVM はこの特定の動作をどのように呼び出しますか?
  2. 独自のマーカー インターフェイスを作成するには? 私の理解のために、簡単なユーザー定義のマーカー インターフェイスを教えてもらえますか?
  3. マーカー インターフェイスにメソッドを含めることは可能ですか?

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

4

6 に答える 6

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

ObjectOutputStreamを実装しObjectInputStreamているかどうかをクラスでチェックします。はいの場合は続行するか、そうでない場合はスローされます。SerializableExternalizableNonSerializableException

  • 独自のマーカー インターフェイスの作成方法

メソッドなしでインターフェイスを作成します。これがマーカー インターフェイスです。

サンプル

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 としてマークすると、このクラスをバイトに変換できることを伝えるだけのように、デフォルトのプロセスを続行します。

于 2012-06-13T04:11:14.153 に答える
15
  1. シリアル化はObjectInputStreamおよびObjectOutputStreamクラスによって処理されます。クラスに特別なシリアル化のニーズがある場合、作成するメソッドはAPIで概説されています。これらのメソッドを呼び出すには、リフレクションが使用されます。

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

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

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

于 2012-06-13T04:08:33.537 に答える
7

はい、独自の Marker インターフェイスを作成できます..以下を参照してください...

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


    }

}
于 2014-03-02T10:24:12.337 に答える
3

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

独自のマーカー インターフェイスを作成できますが、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
            }
        }
    }
    
于 2016-02-08T20:03:55.070 に答える
2

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

public interface CoolObject {
}

その後、コードはオブジェクトが であるかどうかをテストCoolObjectし、それに対して何かを実行できます。

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

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

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

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

于 2012-06-13T04:09:57.800 に答える
0

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

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

于 2012-06-13T04:09:18.853 に答える