2012-11-29 71 views
12

我知道這個問題已被問及通用出來之前。在Array強制執行返回類型時,Array確實贏了一點,它更安全。Java 7 API設計最佳實踐 - 返回數組或返回集合

但是現在,隨着最新的JDK 7,每次當我設計這種類型的API:

public String[] getElements(String type) 
vs 
public List<String> getElements(String type) 

我總是努力想一些很好的理由一個數組或周圍的另一種方式迴歸集錦。當選擇String []或List作爲API的返回類型時,最佳做法是什麼?或者它是馬的課程。

我沒有特別的例子,我更多的是尋找一個通用的利弊比較。

+2

您是否有特殊情況?這真的取決於你想要什麼,每個人都有自己的優點和缺點 – amit

+0

不,我更尋求一個通用的比較,比如什麼情況下Array更好,什麼情況下集合勝出,原因是因爲。 – Shengjie

+2

我想不出任何情況下,除了需要很好的性能(幾乎從不)的情況下,我寧願將數組放在集合上。 – Pablo

回答

8

以下是部分列表陣列的

優點:

  • 快速
  • 自然
  • 你確切地知道 「你會得到什麼」(什麼類型)易變 - 所以你確切知道返回的對象將如何表現。

優點名單:

  • 行爲取決於實際類型返回(例如 - 可以是可變的或不可變這取決於具體型號)
  • 更好hirerchy設計
  • (取決於實際類型)可能是動態大小
  • 更直觀hashCode(),equals() - 如果飼料可能是關鍵以基於散列的集合作爲關鍵。
  • 類型安全:

    String[] arr1 = new String[5]; 
    Object[] arr2 = arr1; 
    arr2[0] = new Object(); //run time error :(
    List<String> list1 = new LinkedList<String>(); 
    List<Object> list2 = list1; //compilation error :) 
    
+2

注意的是,由於數組類型的協方差,它們不是類型安全的。聲明'void setFirst(Object [] xs,Object x);'並調用'setFirst(new Integer [2],「a」)',編譯 –

+0

@MarkoTopolnik:我試圖指出它(在幾分鐘前的編輯中)作爲帶有簡化示例的列表的優點 – amit

+0

是的,我明白了,似乎我忽略了這一點,當我們在示例中使用方法聲明和調用時,這一點更加突出: –

12

如果你正在編寫一個公共API,那麼你的客戶通常會喜歡集合,因爲它們更容易操作並與其他代碼集成在一起。另一方面,如果你期望你的公共API在高性能敏感的上下文中使用,那麼raw數組是首選。

如果您正在爲自己的用途編寫此代碼,那麼最好從一個集合類型開始,只有在涉及到明確的性能問題時才切換到數組。

數組的元素類型可以在運行時通過反射來確定,所以如果該特定的功能對您很重要,那麼偏好數組就是另一種情況。

2

如果我有一個選擇,我會選擇,因爲添加的行爲,我得到了在Java中「自由」的集合。

落實到接口

最大的好處是,如果你返回集合API(甚至一個List,集等),你可以很容易地改變實現(如數組列表,鏈表,HashSet的,等等)而無需使用該方法更改客戶端。

添加行爲

Java的Collections類提供了可應用於包括

  1. 同步集合
  2. 製作一個集合不可改變
  3. 搜索,扭轉了集合衆多包裝,等等...
0

當您公開一個公共API時,返回一個Collection是非常有意義的,因爲它通過使用其上可用的各種方法使客戶的生活更輕鬆。如果想要特殊情況下的數組表示,客戶端始終可以調用toArray()

也可與其他模塊的集成變得更容易,因爲大多數API期望集合,這樣可以工作了。

0

在我的角度來看,這要看是什麼返回值將被用於。

如果返回值將被迭代到,沒有別的,一個數組是最好的選擇,但如果結果會被操縱,然後去適當的集合。

但是要小心,因爲,例如,List應該允許重複,而Set不應該,Stack應該是LIFO,而Queue應該是FIFO,並注意我應該使用SHOULD,因爲只有實現可以確定真實行爲。

無論如何,它實際上取決於。