上下文:
我正在阅读 Sedgewick 和 Wayne 的算法的第 4 章。 此代码示例是“有向图中的深度优先搜索顶点排序”的代码示例。
public class DepthFirstOrder
{
private boolean[] marked;
private Queue<Integer> pre; // vertices in preorder
private Queue<Integer> post; // vertices in postorder
private Stack<Integer> reversePost; // vertices in reverse postorder
public DepthFirstOrder(Digraph G)
{
pre = new Queue<Integer>();
post = new Queue<Integer>();
reversePost = new Stack<Integer>();
marked = new boolean[G.V()];
for (int v = 0; v < G.V(); v++)
if (!marked[v]) dfs(G, v);
}
private void dfs(Digraph G, int v)
{
pre.enqueue(v);
marked[v] = true;
for (int w : G.adj(v))
if (!marked[w])
dfs(G, w);
post.enqueue(v);
reversePost.push(v);
}
public Iterable<Integer> pre()
{ return pre; }
public Iterable<Integer> post()
{ return post; }
public Iterable<Integer> reversePost()
{ return reversePost; }
}
我的问题是为什么队列在各自的检索方法中作为 Iterables 返回。 我明白了代码的其他作用,但我不明白为什么 pre、post 和 reversePost 在这里返回一个 Iterable,而它们是队列吗?
我了解 Iterable 接口(interface)通常的作用,并且队列也是 Iterable,因为 Collection 实现了 Iterable。
但是我不明白为什么这个实现将队列作为 Iterables 返回。
最佳答案
这样外部接口(interface)只 promise 它们是Iterable
,而不是明确它们是Queue
。这意味着:
- 可以更改实现,而不会影响类提供的接口(interface)。
- 返回队列的用户只能依赖它们是
Iterable
,具体来说,他们不能假设它们是Queue
。 (这意味着除了Iterable
所提供的 [remove
] 之外,Queue
无法使用Queue
提供的状态突变功能 - 并非没有强制转换它们,这将是一件坏事™,因为该类保证它们是Iterable
,而不是它们是Queue
。)
更具防御性的类可能会在实际的 Queue
和返回的对象之间插入一个外观,以防止执行上述第 2 项操作的编写不当的代码,但当然,这是有代价的。
关于java - 为什么 Queue<Integer> 在这里返回 Iterable<Integer> ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59920398/