2015-12-02 73 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