2010-06-26 20 views
3
集合

給出一個泛型類:存取方法在Java

class MyClass (
     private List l = new LinkedList <String>(); 

     public void addElement (String s) (l.add (s);) 
     ............. 
) 

的存取方法,讓我在名單上重複,因爲它應該是什麼?

我決定實現一個直接返回迭代器的方法,但看起來不正確,因爲它可以使用remove()從外部更改列表。

您認爲如何?

+0

澄清你的問題 – 2010-06-26 14:26:35

+0

我需要一種方法,允許我迭代列表。 – kafka 2010-06-26 14:37:53

回答

4
import java.util.*; 

public Iterator<String> elements() { 
    return Collections.unmodifiableList(elements).iterator(); 
} 

如果你不介意暴露的元素被存儲爲列表的事實,你也可以用做:如果你想允許呼叫者使用「的foreach」

public ListIterator<String> elements() { 
    return Collections.unmodifiableList(elements).listIterator(); 
} 

語法,你可能要返回一個可迭代:

public Iterable<String> getElements() { 
    return Collections.unmodifiableList(elements); 
} 

並再次,如果你不介意暴露的元素作爲一個列表返回,這最後的解決辦法可能返回List<String>

+0

請注意,對底層'List'的任何修改都會搞砸了。 – 2010-06-26 14:53:01

+0

'unmodifiableList()'方法返回一個視圖,所以對基礎'List'的改變將會反映在'Iterable'中。如果有人在修改視圖時使用視圖,當然可能會出現問題。如果這是一個問題,請返回副本。 – NamshubWriter 2010-06-26 15:04:13

+0

但我使用List作爲例子。我的問題是給定一個位於類中的常規集合,因爲我可以從外部迭代它而不違反封裝 – kafka 2010-06-26 15:16:00

0

最常用的方法是實施Iterable接口,但因爲你不希望暴露remove方法,你可以從NamshubWriter照做或提供您的get(index)size()方法(假設你的類應該表現得像個實施List)。這將允許基於索引的迭代。

+0

但如果列表是鏈表不建議使用訪問位置 – kafka 2010-06-26 14:41:54

+0

然後你堅持使用Iterable並且必須問自己一個問題: 如果你不使用position,你真的需要一個LinkedList嗎?我使用集合更好?或者如果你需要一個列表 - 使用ArrayList代替 – 2010-06-26 14:48:23

0

然而這樣的事情會好嗎?

public Iterator<String> getList(){ 

    return new Iterator<String>(){ 
     Iterator<String> i=l.iterator(); 

     public boolean hasNext() {    
      return i.hasNext(); 
     } 

     public String next() { 
      if(!i.hasNext()) throw new NoSuchElementException(); 

      return i.next(); 
     } 

     public void remove() { 
      throw new UnsupportedOperationException();    
     } 


    } 
} 
+0

這相當於我在我的答案中提出的第一個解決方案。 – NamshubWriter 2010-07-05 17:11:50

0

需要一種方法,讓我只是瀏覽集合元素和保留封裝,方法不可修改......我知道但我不能使用它。