java - 为什么是队列返回一个 Iterable这里?
问题描述
语境:
我正在阅读 Sedgewick & Wayne's Algorithms 的第 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 接口通常做什么,并且 Queue 也是 Iterable,因为 Collection 实现了 Iterable。
但是,我不明白为什么这个实现将队列作为可迭代对象返回。
解决方案
这样外部接口只承诺它们是 s Iterable
,而不是特别承诺它们是Queue
s。这表示:
- 实现可以改变而不影响类提供的接口。
- 返回队列的用户只能依赖他们是
Iterable
s,他们不能假设他们是Queue
s,特别是。Queue
(除其他外,这意味着除了 [remove
]之外,不能使用状态变异特性Iterable
- 不强制转换它们,这将是一件坏事™,因为该类所保证的只是它们是Iterable
s,而不是他们是Queue
s。)
一个更具防御性的类可能会在实际对象和返回的对象之间插入一个门面,Queue
以防御上面 #2 中写得不好的代码,但当然,这是有代价的。
推荐阅读
- node.js - Gatsby develop 和 Gatsby info 都返回错误
- algorithm - 循环时间复杂度内的递归
- reactjs - 在 MobX-React 存储中应用代理对象而不是数组
- python - 用于 python Web 应用程序的 Heroku 非易失性内存
- python - Django 无法从我的数据库中删除用户
- python - 我的 Flask 无法正确显示 mysql 行
- r - 如何用特定日期替换丢失的日期并将格式保留为 R 中的日期
- python - Python:将numpy数组分配给变量
- json - 诉诸多维数组反应
- javascript - 为什么我的对象键值对被覆盖而不是创建新的键值对?