2012-02-22 14 views
2

今日は仕事でいくつかのJavaコードに走った:Javaの組み込み静的インタフェース

public interface A { 

    public static interface AObj { 
     String toXml(); 
     int getCode(); 
    } 

    public static interface AMap { 
     String toXml(); 
     int blah(); 
    } 
    ... 
} 

私が前に既存のインタフェースに組み込み静的インタフェースを持つ発生していません。あまり意味がありません。誰かがコメントできますか:

a)この良いデザインの練習ですか? b)個々のインターフェースファイルを持っているとどういう利点がありますか? c)これはC++プログラマが作成したもので、名前空間を再作成しようとしているという印象を受けます。そのような場合は、パッケージを使用するだけではどうですか?

コメントは大歓迎です。

よろしく、 アリスター。

+3

インタフェース内に 'public'と' static'キーワードは暗黙的なので必要ありません! – adarshr

+0

私はこのようなことをインターフェースで行う必要は全く見たことがありません。インナークラスには価値がありますが、私はこのインターフェースのメリットはインターフェースでは分かりません。名前空間を再作成しようとしていたのは間違いないと思います。パッケージはすべてのケースの99.9999%で十分でなければなりません。 – Joe

+0

これは非常に類似した質問です:http://stackoverflow.com/questions/71625/why-would-a-static-inner-interface-be-used-in-java –

答えて

2

良い/悪い練習は議論の余地があります。通常、ネストされたインタフェースがその親に対して不可分なエンティティである場合、インタフェースをネストします。

java.util.Mapのソースコードを見てください。それは喜んでMap.Entryを内部に埋め込みます。著者は、間違いなく経験の浅いJava開発者ではないJosh Blochです。だから私はそのようにインターフェイスを設計することの背後に正当な理由があるに違いないと確信しています。

(JavaDocとコメントは削除されています)次のようになります。

public interface Map<K,V> { 
    int size(); 
    boolean isEmpty(); 
    boolean containsKey(Object key); 
    boolean containsValue(Object value); 
    V get(Object key); 
    V put(K key, V value); 
    V remove(Object key); 
    void putAll(Map<? extends K, ? extends V> m); 
    void clear(); 
    Set<K> keySet(); 
    Collection<V> values(); 
    Set<Map.Entry<K, V>> entrySet(); 

    interface Entry<K,V> { 
     K getKey(); 
     V getValue(); 
     V setValue(V value); 
     boolean equals(Object o); 
     int hashCode(); 
    } 

    boolean equals(Object o); 
    int hashCode(); 
} 
+0

あなたはこれを見てください[同じ質問](http ://stackoverflow.com/questions/71625/why-would-a-static-inner-interface-be-used-in-java)。 @PaŭloEbermannのコメントはadarshrの答えを完成させる。 > "ネストされたインターフェースは自動的に静的で、キーワードを書くかどうかにかかわらず" – diodfr

+0

ありがとう、私はちょうど決定がなされた理由を理解する必要があると思います。私はいつも別のファイルに別々のインターフェイスを置くと思う。 – AlMcLean

0

まず第一に、あなたは(コメントを参照)に述べたadarshrとしてpublicまたはstaticを入力する必要はありません。内部インターフェイスについては、すべてが使用されているコンテキストに依存します。たとえば、GWTはセルリストのアプリケーションスタイルを記述するインターフェイスを公開する必要があります。私は一般的なデバイスのための1つのインターフェースと、いくつかの特定のデバイス(アンドロイド、iphoneなど)のためにそれを拡張する内部インターフェースを持っています。私の意見では、特に、特定のデバイス用のこれらのインターフェースにはすべて、デフォルトの動作を上書きする1つのメソッドが含まれていることはあまりありません。

しかし、上記の例のようにインターフェイスが非常に結合されていない場合、私はむしろそれらを別々のファイルに入れます。もちろん、それはデザインによってあなたの選択です。

関連する問題