Iterable vs Iterator作为返回行为(最佳实践?)

时间:2012-05-14 09:57:52

标签: java list collections iterator iterable

我想知道您对将所有集合函数输出更改为Iterable类型的意见。

在我看来,这可能是当今Java中最常见的代码,并且每个人在99%的时间内总是返回List / Set / Map,但不应该是返回类似

的标准
    public final Iterable<String> myMethod() {
            return new Iterable<String>() {
                  @Override
                  public Iterator<String> iterator() {return myVar.getColl();}
            };
    }

这有什么不好吗?你知道所有DAO类,这些东西就像

    Iterable<String> getName(){}
    Iterable<Integer> getNums(){}
    Iterable<String> getStuff(){}

而不是

    List<String> getName(){}
    List<Integer> getNums(){}
    Set<String> getStuff(){}

毕竟,99%的时间你会在for循环中使用它......

你认为什么?

3 个答案:

答案 0 :(得分:3)

这将是非常糟糕的计划。

我不会说你只是在for循环中使用它的90%。也许40-50%。其余时间,您需要更多信息:sizecontainsget(int)

此外,返回类型本身就是一种文档。返回Set可确保元素是唯一的。返回List个文档,表明元素的顺序是一致的。

我不建议退回特定的收集实施,例如HashSetArrayList,但我通常更愿意返回SetList而不是{{} 1}}或Collection,如果该选项可用。

答案 1 :(得分:2)

List,Set&amp;映射是接口,因此它们与特定实现无关。所以他们是返回类型的好候选人。

List / etc和Iterable / Iterator之间的区别就是访问类型。一个用于随机访问,您可以直接访问所有数据,Iterable可以避免全部可用。非常适用于您拥有大量数据且无法将其全部存在的情况。示例:迭代大型数据库结果集。

所以这取决于你正在访问的内容。如果数据量很大并且必须迭代以避免性能下降,那么使用迭代器强制它。在其他情况下,列表是可以的。

编辑:返回迭代器意味着你唯一能做的就是在没有其他可能性的情况下循环遍历这些项目。如果您需要这种权衡以确保性能,那么,正如所说的那样,只在需要时使用。

答案 2 :(得分:0)

你所编码的是部分正确的:

您需要测试以下项目的某些方法:

  1. size
  2. contains()
  3. get(index)
  4. exists()
  5. 因此,您应该重新考虑新的体系结构,或者使用此方法覆盖它,以便每次都能获取所需的内容。