2009-08-18 46 views

回答

5

因爲有時候,如果某種類型的某些屬性本身可以用作類型,那麼它真的很有意義 - 想起Serializable。如果我做出這樣的方法:

public void save(Object data){ ... } 

...你真的不知道data如何保存。 VM序列化? Bean屬性序列化?一些自制的計劃?然而,如果你寫這樣的:

public void save(Serializable data){ ... } 

...這是很清楚的(如果只ObjectOutputStream設計師曾使用過這種可能性!)。有時候,當你想向類型添加元數據時使用註釋是有意義的,但在這種情況下,我會爲標籤界面進行爭論。

1

它被用來提及某個類的某些屬性(如Serializable顯示,該類允許序列化)。現在註釋可以完成這項工作。

+0

沒有,說明不適合標記接口的替代品。 – skaffman 2009-08-18 11:00:30

+1

@skaffman:難道除了難以檢查註釋之外,還有一個接口讓你說'註釋不是標記接口的替代品'? – 2009-08-18 11:07:58

+0

可以註釋類以外的代碼。人們也可以使用帶有參數的註釋。例如,以JSR 305'@ ScriptAssert'驗證註釋爲例。 – 2013-10-16 19:29:20

6

一個標記界面通常有一些與之相關的魔力:直接內置到虛擬機或使用反射。因爲這個魔法可以在技術上適用於任何課程,所以你可以使用標記來表明你對魔法有很好的想法,以及它是否適用於你的課堂。

+0

這是標記界面播放的唯一角色。 – adatapost 2009-08-18 11:03:54

+0

是嗎?在我看來,擴展標記接口可以在編譯時爲只接受類型爲標記接口的擴展的對象的方法提供類型檢查。例如,查看EventListenerList.add。 – 2013-04-10 13:40:28

6

的標記接口VS註釋的問題在Bloch的「有效的Java」進行了討論,並且段的一部分可以用谷歌圖書here

+0

+1 - 像往常一樣,布洛赫把它總結得很好,並回答我對@ Mnementh的回答的評論/問題。 – 2009-08-18 11:27:43

0

除了其他的答案標記接口也可用於指定其他沒有被其他已經實現的接口繼承的類的屬性。其中一個例子是接口RandomAccess。它表示可以隨機訪問而不會損失性能的集合,並且不必通過迭代器訪問以實現該性能。

0

您可以使用標記界面標記您的課程,以向您的班級開發人員和消費者說明您明確支持該功能。想想Serializable;需要堅持會話並使用序列化來完成的人可以安全地使用班級的對象。

它可以進一步用於反射;現在通常使用註釋來做到這一點,但在過去的日子裏,您可以檢查一個類,檢查它是否實現了某個接口(如DAO),如果是,則進一步處理對象(我正在考慮實體註釋)。

0

標記接口與內部沒有抽象方法的接口,它們被用來增加一個數據類型,它實現它們的類和成爲其他接口父接口(特別是與接口的多個繼承)

public interface name {} 
public interface john1 {} 
public interface john2 {} 
public interface Demo extends john1 , john2 , name {} 

**當JVM看到名稱界面時,它會發現該演示將顯示特定的內容。

0

我還要補充你可以使用標記的接口來限制一個實例的所有權:

interface IFlumThing; 
interface IFlooThing; 

class BaseThing {...} 

class FlumThing extends BaseThing implements IFlumThing {}; 
class FlooThing extends BaseThing implements IFlooThing {}; 

class Flum { 
    addThing(IFlumThing thing){...}; 
} 

class Floo { 
    addThing(IFlooThing thing){...}; 
}