2015-12-02 84 views
-2

所以這裏有這個類,它有一個字段,可以說 Stack<Integer> changed_vertices和它的私人可迭代。如果它是一個原始類型變量,我會寫一個getter來從其他類中獲取值。但我需要從外部(從其他類)迭代此堆棧。如何迭代Java類中的私有集合成員?

我可以實施迭代這個堆棧什麼樣的「吸」的?由於某些原因,我無法將其從私人更改爲大衆

謝謝。

+0

堆棧的副本?對其迭代器的引用?哪裏有問題? – RealSkeptic

+0

問題是我是Java noob)不,我不想複製這個堆棧,因爲它需要O(n)次。我能做什麼?將引用返回到堆棧並使用此引用進行迭代?這是一種很好的編程風格嗎? – alekscooper1

+0

如果您希望客戶端可以訪問'Stack'及其所有操作,則返回'Stack'。如果你希望他們只能檢索一個迭代器,返回一個'Iterable'。如果你希望他們只能訪問當前的迭代器,則返回一個'Iterator'。 –

回答

1

您有多個選項。

簡單的返回堆棧:

public Stack<Integer> getChangedVertices() 
{ 
    return changed_vertices; 
} 

返回堆棧爲不可修改的列表:

public List<Integer> getChangedVertices() 
{ 
    return Collections.unmodifiableList(changed_vertices); 
} 

返回一個迭代:

public Iterator<Integer> getChangedVertices() 
{ 
    return changed_vertices.iterator(); 
} 

接受消費者,並推動堆棧內容進入消費者

public void consumeChangedVertices(Consumer<Integer> action) 
{ 
    changed_vertices.stream().forEach(action); 
} 

這一切都取決於呼叫者需要做的和/或應被允許與堆棧做。

+0

在所有選項中,第一個選項似乎是最好的,因爲它提供了更多的自由度。非常感謝! – alekscooper1