2009-09-17 45 views
7

在解析某些xml文件的過程中,我遇到了一種情況,我必須使用接口作爲標籤來標識某些標籤屬於某個類別,例如,我創建了一個接口來標識這些類是否被使用來表示xml標籤,並且ContainableTag指出某些標籤可以是某些標籤的子標籤之一。是Interface作爲標籤在Java OO中的一個不好的做法?

然後我跌入此頁:http://xahlee.org/java-a-day/interface.html(請認準「接口爲標籤」會議)。它說:

問題的要點是,它是在 的 語言一塊數學無關的。如在語言中的標記機制 ,用於從軟件工程 透視可能 益處,那麼它不應該是 設計爲 類接口的一部分,因爲 標記的編程 接口的概念,和概念,在語義上是完全不同的。

那麼,界面作爲標籤一定是一個不好的做法?作爲一名java程序員,我們有其他的選擇嗎?

+0

您應該在SO上指出關於此主題的現有查詢。他們還包含很多參考資料。不過,你挖出的有趣的文章。 – ShiDoiSi 2009-09-17 07:30:12

回答

8

作爲標記的接口在很大程度上已被Java 5或更高版本中的註釋機制所取代。它們允許您添加任意的元數據。如果你的接口是空的,只能用作類標記,那麼你應該使用註解來代替。

+0

我從不研究註釋的用法,儘管我在某些框架中使用它。謝謝。我將谷歌教程。 如果您碰巧有一些註釋教程,您還可以傳遞一些註釋教程的鏈接嗎? – 2009-09-17 04:27:23

+3

http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html 使用註釋最大的問題在於,如果您需要使用保留「運行時」的註釋來註釋您的註釋if你想在運行時使用它們。默認情況下,它們被編譯器丟棄。 – Jherico 2009-09-17 04:34:00

+0

太棒了!非常感謝你。 – 2009-09-17 04:38:19

5

註解不一定是你想要的。標記接口是一種將類型屬性工作到類型本身的方法。例如,如果你正要開始編寫代碼看起來像這樣:

@interface ContainableTag{} 

@ContainableTag public class Foo {} 

// ... elsewhere... 

/** 
* Adds obj as a child element. 
* @throws IllegalArgumentException if obj is not tagged with 
*   the ContainableTag annotation. 
*/ 
public void addElement(Object obj){ 
    if (!obj.getClass().isAnnotationPresent(ContainableTag.class)) 
     throw new IllegalArgumentException("obj is not a ContainableTag"); 
    // add the containable tag as an element 
} 

然後考慮,如果你真的不認爲這看起來更好:

interface ContainableTag {} 

public class Foo implements ContainableTag {} 

// ... elsewhere... 

public void addElement(ContainableTag ct){ 
    // add the containable tag as an element 
} 

當然,標籤化的界面不提供關於類型本身提供什麼行爲的任何信息,但它允許其他類型強制執行此非行爲屬性確實。如果ObjectOutputStreamwriteObject(Serializable)方法,而不是writeObject(Object),我當然會免受許多煩人的錯誤。

編輯:我有not insignificant support在這裏。

+0

哈哈..我的「有效java「已經太老了,沒有這篇文章。謝謝。 – 2009-09-17 07:27:28

7

雖然註釋可能爲標記接口的完成提供了一種替代方法,但它們只能在Java中使用,並且不能很好地與IDE集成:我還使用標記接口標記項目中的相關概念,然後可以使用鍵入層次結構瀏覽器來查找所有成員(我猜這將最終由主要IDE支持註釋)。對於你提到的文章,我認爲如果一個類在語法上/結構上「滿足」了一個接口,那麼該接口可能/應該被自動應用於類(「任何類都可以聲明它[RandomAccess]作爲接口...「)。在我看來,這是倒退的想法。

我會爭辯說,在`instanceof'語句中使用這樣的標記接口的地方使用了反向邏輯,但只要你被困在沒有多重繼承,方面和註釋的語言中,我看不到更好的方法來實現這一點,而不需要跳出基本語言。

另請注意,關於一個空接口始終適用的這種無用參數也可以應用於註釋。

+0

好的一點。謝謝。 – 2009-09-17 07:32:22

相關問題