2012-02-22 76 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)這對vs有單獨的接口文件有什麼好處。 c)這是由C++程序員編寫的,我得到了他們試圖重新創建名稱空間的印象。如果是這樣的話,爲什麼不使用包?

任何意見最受歡迎。

Regards, Alistair。

+3

因爲它們是隱式的,所以你不需要'public'和'static'關鍵字! – adarshr 2012-02-22 12:14:23

+0

我從來沒有見過需要使用接口來做任何事情。內部類有價值,但我沒有看到接口的好處。我認爲你是對的,他們試圖重新創建命名空間。在99.9999%的情況下,軟件包應該足夠了。 – Joe 2012-02-22 12:21:21

+0

這裏有一個非常類似的問題:http://stackoverflow.com/questions/71625/why-would-a-static-inner-interface-be-used-in-java – 2012-02-22 12:26:25

回答

2

好的/壞的做法可能是有爭議的。通常情況下,如果嵌套接口是與其父節點不可分離的實體,則可以嵌套接口。

看看java.util.Map的源代碼。它愉快地嵌入Map.Entry裏面。作者是Josh Bloch,絕對不是沒有經驗的Java開發人員。所以我確信這樣設計界面必須有一個有效的推理。

下面是它的樣子(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 2012-02-22 12:24:07

+0

謝謝,我想我只需要弄清楚爲什麼做出決定。我想我總是會把不同的接口放在不同的文件中。 – AlMcLean 2012-02-22 12:42:09

0

首先,你不必鍵入publicstatic爲adarshr規定(見註釋)。關於內部接口:一切都取決於它們所使用的上下文 - 例如,GWT需要公開描述應用程序樣式的接口來顯示單元列表。我有一個通用設備接口,以及內部接口擴展它的一些特定的設備(Android,iPhone等)。在我看來,這不是一團糟,特別是針對特定設備的所有這些接口都包含一種覆蓋默認行爲的方法。但是,如果接口不像上面提到的那樣緊密耦合,我寧願將它們放在單獨的文件中。當然,這是您的選擇,取決於設計。