首页 > 解决方案 > 为什么是队列返回一个 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 返回。我得到了代码的其他功能,但我不明白为什么prepostreversePost在它们是队列时在这里返回一个 Iterable ?

我了解 Iterable 接口通常做什么,并且 Queue 也是 Iterable,因为 Collection 实现了 Iterable。

但是,我不明白为什么这个实现将队列作为可迭代对象返回。

标签: javagraphdirected-acyclic-graphstopological-sort

解决方案


这样外部接口只承诺它们是 s Iterable,而不是特别承诺它们是Queues。这表示:

  1. 实现可以改变而不影响类提供的接口。
  2. 返回队列的用户只能依赖他们是Iterables,他们不能假设他们是Queues,特别是。Queue(除其他外,这意味着除了 [ remove]之外,不能使用状态变异特性Iterable- 不强制转换它们,这将是一件坏事™,因为该类所保证的只是它们是Iterables,而不是他们是Queues。)

一个更具防御性的类可能会在实际对象和返回的对象之间插入一个门面,Queue以防御上面 #2 中写得不好的代码,但当然,这是有代价的。


推荐阅读