2012-05-14 26 views
3

我只是想知道您的意見,即將所有Collections函數輸出更改爲Iterable類型。Iterable vs Iterator作爲返回行爲(最佳實踐?)

這在我看來很可能在Java中最常用的代碼的今天,每個人都總是返回一個列表/設置/地圖中的時候99%,但shouldn't是標準的返回類似

public final Iterable<String> myMethod() { 
      return new Iterable<String>() { 
        @Override 
        public Iterator<String> iterator() {return myVar.getColl();} 
      }; 
    } 

這一切都很糟糕嗎?你知道所有的DAO類,這東西會像

Iterable<String> getName(){} 
    Iterable<Integer> getNums(){} 
    Iterable<String> getStuff(){} 

代替

List<String> getName(){} 
    List<Integer> getNums(){} 
    Set<String> getStuff(){} 

畢竟,次99%,你會在for循環中使用它...

你有什麼想法?

+0

有了一套,你通常也想測試一個項目的存在 - 這需要實際的設置。 –

+0

你是對的,這是愚蠢的放置在那裏,特別是HashSet,誰沒有秩序。 – Whimusical

回答

3

這將是一個真的很糟糕的計劃。

我不會說90%的時間你只是使用它在for循環。也許40-50%。其餘時間,您需要更多信息:size,containsget(int)

此外,返回類型本身就是一種文檔。返回Set保證元素將是唯一的。返回一個List文檔,表明元素將以一致的順序排列。

我不會推薦返回特定集合實現比如HashSetArrayList,但我通常更願意返回SetList而非CollectionIterable,如果該選項可用。

+0

你說得對。但我的意思是,對於那些你知道你只需要一個列表/一組東西來迭代的情況,對於我來說大多數情況下,你認爲這樣做很好嗎? – Whimusical

+0

我將_certainly_不包裹'List'或'Set'在一個迭代中。如果你想讓返回類型爲'Iterable',只需返回'List',它是一個'Iterable'實例。但說實話,我寧願返回List或Set。 –

2

List,Set & Map是接口,所以它們並沒有綁定到特定的實現。所以他們很適合返回類型。

List/etc和Iterable/Iterator之間的區別是訪問類型。一個用於隨機訪問,您可以直接訪問所有數據,並且Iterable可以避免使用全部數據。理想的情況下,你有大量的數據,並沒有效率,所有這一切就地。示例:遍歷大型數據庫結果集。

所以這取決於你正在訪問什麼。如果數據可能很大並且必須迭代以避免性能下降,那麼使用迭代器強制它。在其他情況下,List可以。

編輯:返回一個迭代器意味着你可以做的唯一事情就是在沒有其他可能的情況下遍歷這些項目。如果您需要這種權衡來確保性能,那麼可以,但如上所述,只有在需要時才使用。

0

那麼你編碼的是部分正確:

你需要測試,如項目的一些方法:

  1. size
  2. get(index)
  3. exists()

所以,你應該重新思考你的新架構,或者用這種方法重新考慮它,以便隨時獲取所需的內容。