4

我只想知道您对将所有 Collections 函数输出更改为 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 循环中使用它……

你怎么看?

4

3 回答 3

3

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

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

此外,返回类型本身就是一种文档。返回 aSet保证元素是唯一的。返回List元素将保持一致顺序的文档。

我不建议返回特定的集合实现,例如HashSetor ,但如果选项可用ArrayList,我通常更喜欢返回 a Setor aList而不是 a Collectionor an 。Iterable

于 2012-05-14T10:00:24.203 回答
2

List、Set 和 Map 是接口,因此它们不依赖于特定的实现。所以它们是返回类型的好候选。

List/etc 和 Iterable/Iterator 的区别在于访问的类型。一种是随机访问,您可以直接访问所有数据,而 Iterable 避免了所有可用数据的需要。在您拥有大量数据并且将其全部到位的情况下是理想的选择。示例:迭代大型数据库结果集。

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

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

于 2012-05-14T10:02:34.843 回答
0

那么你编码的部分是正确的:

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

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

因此,您应该重新考虑您的新架构或使用此方法覆盖它,以便每次都能满足您的需求。

于 2012-05-14T10:05:30.503 回答