迭代器与可迭代对象作为返回行为(最佳实践)的区别?

4

我只是想知道您对将所有集合函数输出更改为可迭代类型的看法。

这在我看来可能是现今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循环中使用它...

你觉得呢?


使用集合时,您通常还需要测试项目的存在性 - 这需要实际的集合。 - Greg Kopff
你说得对,把Set放在那里真是愚蠢,特别是HashSet,它没有顺序。 - Whimusical
3个回答

3

这将是一个非常糟糕的计划。

我不会说在90%的时间里你只是用它在for循环中。也许只有40-50%的时间,其他时间你需要更多的信息:size、contains或get(int)。

另外,返回类型本身就是一种文档说明。返回一个Set保证元素是唯一的。返回一个List记录元素按一致的顺序排列。

我不建议返回特定的集合实现,如HashSet或ArrayList,但如果有选择的话,我通常更喜欢返回一个Set或List而不是Collection或Iterable。


你是对的。但我指的是那些你知道只想要一个列表/集合来迭代的情况,这对我来说是大多数情况,你认为这样做好吗? - Whimusical
我肯定不会将ListSet包装在可迭代对象中。如果你想要返回类型为Iterable,只需返回List,因为它是一个Iterable实例。但说实话,我仍然更喜欢返回ListSet - Louis Wasserman

2
列表、集合和映射都是接口,因此它们不与特定的实现绑定。因此,它们是返回类型的良好选择。
List等与Iterable / Iterator之间的区别在于访问方式。一个用于随机访问,您可以直接访问所有数据,而Iterable避免了需要拥有全部数据的必要性。在需要大量数据且将其全部放置不高效的情况下,这是理想的。例如:迭代大型数据库结果集。
因此,这取决于您正在访问什么。如果您的数据可能很大并且必须进行迭代以避免性能下降,则使用迭代器强制执行。在其他情况下,列表就可以了。
编辑:返回迭代器意味着您唯一能做的就是循环遍历项目,没有其他可能性。如果您需要这种权衡来确保性能,那么好吧,但是如上所述,仅在需要时使用。

0

你编写的代码部分正确:

你需要测试一些项目方法,例如:

  1. size
  2. contains()
  3. get(index)
  4. exists()

因此,你应该重新考虑你的新架构或使用这种方法覆盖它,以便每次获取你所需的内容。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接