2009-09-17 11 views
7

特定のXMLファイルの解析中に、特定のタグが特定のカテゴリに属していることを識別するためのラベルとしてインターフェイスを使用する必要があるという状況が発生しました。たとえば、タグインターフェイスを作成して、 xmlタグを表現するにはContainableTagがあります。特定のタグはいくつかのタグの子タグの1つになります。インタフェースとしてのラベルはJava OOでは悪い習慣ですか?

次に、私はこのページにつきました:http://xahlee.org/java-a-day/interface.html( "インターフェイスとしてラベル"のセッションを探してください)。それは言う:

問題の要点は、それが 言語で数学的な見当違いの 作品であるということです。言語でラベル付け機構 として、ソフトウェア工学 観点から可能 利益のために、それは ラベルの概念以来、クラス インタフェースの一部として設計さ すべきではない、と インタフェースをプログラミングの概念、意味的に異種である。

ラベルは必然的に悪い練習ですか? Javaプログラマとして、他にもいくつかの選択肢がありますか?

+0

SOでこのトピックに関する既存のクエリを指摘する必要があります。彼らはまた、多くの参照を含んでいます。あなたが掘った興味深い記事。 – ShiDoiSi

答えて

8

マーカとしてのインタフェースは、Java 5以降のアノテーション機構に置き換えられています。彼らは任意のメタデータを追加することができます。インターフェースが空でクラスマーカーとしてしか機能しない場合は、代わりに注釈を使用する必要があります。

+0

私は注釈の使用法を調べていませんが、特定のフレームワークで使用しています。ありがとうございました。私はチュートリアルのためにgoogleします。 もしあなたが手近にあるのであれば、注釈チュートリアルのいくつかのリンクを私に渡すことができますか? –

+3

http://java.sun.com/j2se/1.5.0/docs/guide/language/annotations.html 注釈を使用する上で最も大きな問題は、アノテーションに「ランタイム」の注釈を付ける必要がある場合です。実行時にそれらを使用したいとします。デフォルトでは、それらはコンパイラによって破棄されます。 – Jherico

+0

素晴らしい!どうもありがとうございました。 –

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(Object)ではなくwriteObject(Serializable)メソッドを持っていたなら、私は確かに迷惑なバグをたくさん覚えていたでしょう。

編集:ここにnot insignificant supportがあります。

+0

ハハ..私の "効果的ですjava "はこの記事を読むには古すぎます。ありがとうございました。 –

7

アノテーションは、どのマーカインタフェースが達成できるかを示す代替手段を提供することがありますが、Javaでのみ利用可能であり、IDEとの統合が難しいです。また、マーカインタフェースを使用してプロジェクトの関連概念にタグを付けます。すべてのメンバーを見つけることができます(これはまもなく、主なIDEによってすぐにアノテーションがサポートされると思います)。

あなたが言及している記事では、クラスが構文的に/構造的にインターフェイスを「満たす」場合、そのインターフェイスは自動的にクラスに適用される必要があります(「どのクラスでも宣言できます[RandomAccess]をインタフェースとして使用... ")。それは私の意見では、後ろ向きに考えている。

私は、このようなマーカーインターフェイスが `instanceof 'ステートメントで使用される場所は、逆論理を使用すると主張しますが、複数の継承、アスペクト、アノテーションなしの言語で詰まっている限り、基本言語から抜け出すことなくこれを達成するより良い方法です。

また、常に適用可能な空のインターフェイスに関するこのデッドビート引数は、アノテーションにも適用できます。

+0

良い点。ありがとう。 –

関連する問題