2012-06-13 62 views
9

我知道java中的標記接口。它用於定義關於類的特定行爲。例如,Serializable接口具有將對象存儲到字節流及其相反過程的特定功能。但我不知道這個特定的行爲在哪裏實施,因爲它沒有任何方法。如何在Java中編寫我們自己的標記接口?

  1. JVM如何調用此特定行爲?
  2. 如何編寫我們自己的標記界面?你能給我一個簡單的用戶定義的標記界面,我的理解?
  3. 是否有可能在標記接口中有方法?

請指導我解決此問題。

+0

爲什麼你要寫標記接口?這是一種過時的事情。使用_annotations _....無論如何,你會使用自己的「標記界面」 –

+0

@Op De Cirkel - 它絕對不是過時的,首要的是,標記接口定義了一個類型,由標記類的實例實現;標記註釋不。閱讀有效的Java第2版第37項以獲取更多詳細信息。 – Premraj

回答

11
  1. 序列化由ObjectInputStreamObjectOutputStream類處理。如果某個班級有特殊的序列號需求,則在API中概述創建的方法。反射用於調用這些方法。

  2. 與編寫任何其他接口的方式相同。

  3. 沒有什麼能阻止你將標記方法放入標記界面。

現在比較常見的做法是使用annotations來提供相同的元數據標記接口。

+0

:非常感謝你...我想知道他們在哪個地方編寫關於ObjectInputStream類的代碼......然後,只有我可以編寫自己的標記接口,如可以serilizable ... – Saravanan

+0

通過提到的類的來源,而不是要求確切的線! – Premraj

+3

@Saravanan JDK是開源的。 ['ObjectInputStream'](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectInputStream.java/?v=source)。 ['ObjectOutputStream'](http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/7-b147/java/io/ObjectOutputStream.java/?v=source)。 – Jeffrey

0

據我所知,標記接口通過「實用程序」類獲取它們的行爲。例如,如果您已經閱讀了四人幫的設計模式手冊,那麼您的行爲是使用另一個類中定義的標記接口標記的類。

例如,您有一個標記界面「可保存」。你有一個遍歷實現這個接口的所有類的過程(通過反射),然後保存它的操作。

2

正如維基百科文章Marker interface pattern中非常好地解釋的那樣,標記接口是一種元數據形式。客戶端代碼可以測試一個對象是否是標記接口的一個實例,並相應地調整它的(客戶端)行爲。這裏有一個標記接口:

public interface CoolObject { 
} 

然後代碼可以測試對象是否爲CoolObject,並用它做什麼:

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

Serializable接口定義爲Java語言的一部分。你不能在這個級別自己實現行爲。

您可以將方法添加到標記接口,但會將標記模式與接口的其他概念使用混合在一起,並且可能會造成混淆。 (是否爲實現標記或其行爲或兩者而實現接口的類?)

正如維基百科文章中所解釋的,Java中的標記接口可以(也可能應該)用annotations替換。

17
  • JVM如何調用該特定行爲

ObjectOutputStreamObjectInputStream會檢查你的類它是否implementes 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它只是告訴這個類可以轉換爲字節。

+3

這必須是答案 –

2

是的,我們可以創建自己的標記interface..See下一個...

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


    } 

} 
0

標記接口,沒有任何方法。 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 Marker) { 
          // do some task 
         } 
        } 
    } 
    
+1

你可能想要更多的關注,何時你編寫代碼,因爲你的第3點代碼有幾個錯誤。 – Tom

相關問題