2011-05-17 42 views
2

是否有可能在java中編寫我們自己的標記接口?我正在寫一個代碼,如java中的標記接口

public interface MyMarker{ 

} 

這是一個標記接口?

,如果有可能的話,我怎樣才能使認識到JVM,這個接口是我自己創造標記接口?

+0

請問什麼你想用標記界面解決哪種問題?也許有人可以提出一種替代模式。 – 2011-05-17 05:55:31

回答

13

是的,這是一個標記界面。您會測試是否「實現」它作爲一個對象僅僅作爲:

if (x instanceof MyMarker) 

對於特定類(而不是對象)你想要

if (MyMarker.isAssignableFrom(otherClass)) 

而應該考慮的使用註釋標記接口。它們並不總是直接替換,但在很多情況下它們用於相同的目標,並且註釋(IMO)更清潔。

+0

但每個標記界面都有自己的屬性..我怎麼能設置我的標記接口屬性? – Abhisek 2011-05-17 05:27:20

+0

@Abhisek:你什麼意思?你能舉個例子嗎? – 2011-05-17 05:28:16

+0

你能給我舉個簡單的例子嗎? – Abhisek 2011-05-17 05:29:11

0
  1. 「通常」標誌接口被用於以信號編譯或可能在處理「標記類型」的對象所需要的附加元數據的JVM。

  2. 例如, 如果一個類使用java.io.Serializable接口,那麼編譯實際上會生成JVM的運行時所需的類的標記接口的實現代碼,同時存儲/編組該對象。

  3. 所以我看不出定義標記接口的任何實際效用(因爲它不會意味着編譯器/ JVM任何事情上的有限集合在Java標記接口工程)

+0

你可以告訴我什麼特殊的iterface(可serilizable等)類型,每當我們在我們班使用他們的行爲不同於其他,雖然這些界面不包含任何內容(因爲他們是所謂的標記界面) – Abhisek 2011-05-17 08:08:44

+0

@Ahhisek:對不起,晚了轉身。正如我所提到的,標記接口就像編譯**的**特殊指令,用於生成附加代碼,以便JVM在運行時爲該標記接口提供特殊用途。例如,對於java.io.Serializable,編譯會在類文件中放入一些附加信息,這有助於JVM進行序列化。這就是爲什麼標記接口的行爲不同,因爲它們被編譯器區別對待。 – Santosh 2011-05-17 14:16:08

0

一類實現了一個接口,它獲得了一些特殊的質量,接口稱爲標記或標記接口。

例如: 類實現Runnable接口類作爲一根線。所以它被稱爲標記接口。

A class implements java.io.Serializable interface that clsass act to send object class which is needed at run time by JVM while storing/marshaling that object. 

A Class implements java.lang.Clonable interface that object ready to cloning. so java.lang.Clonabel interface is called Marker or Taged interface. 

有人相信所有空接口都是標記接口。但這是不正確的。

因爲我們採取java.lang.Runnable接口它不是空的接口,它包含 方法稱爲無效的run()。

在Java API最大

所有標記Interfafes是空喜歡的java.io.Serializable。

一些標誌接口或不爲空喜歡了java.lang.Runnable。

3

我們不能說這沒有任何方法的接口是一個標記接口。因爲「標記」這個詞本身就意味着「標記某物」的意思。所以我說,接口(不管是什麼可能是它的內容)通過實現,如果一個類獲得一些額外的或專門的行爲,如允許對象存儲到持久性存儲(可序列化)或允許一個對象使其重複或複製(克隆)或者允許用戶只實現一個方法(如run()),而不是在線程編程的子類(Runnable)中實現近4個t0 5方法。

這些是專門的行爲,它可以通過一個對象獲得,當它實現那些什麼都沒有,但叫做MARKER INTERFACE的接口。

結論

一個標記接口,可能會或可能不會包含方法...

它也可以被稱爲標記接口,虛擬接口,空接口....