【问题标题】:How to know whether Iterator of a Collection supports remove()?如何知道 Collection 的 Iterator 是否支持 remove()?
【发布时间】:2015-04-07 10:13:53
【问题描述】:

所有 Java Collections 都实现了Iterable,因此它们必须提供一个Iterator,它指定了一个可选方法remove()。当在Iterator 上调用remove() 时,它可以抛出一个UnsupportedOperationException

我如何知道 Java 标准库中的 Collection 是否会在不运行代码的情况下返回支持 remove()Iterator

当然,我希望这些信息出现在该类的remove() 方法的Javadoc 中,结果却发现了一堆超类和接口的链接。例如:http://docs.oracle.com/javase/8/docs/api/java/util/TreeSet.html#iterator-- 我也没有找到任何关于链接的说明。

【问题讨论】:

  • 唯一真正的方法是尝试处理异常,我知道很糟糕。 Collections API 不是设计最优雅的 API,它不应该有大多数核心接口的可变和可变版本
  • 如果您阅读了您链接到的 TreeSet 的类级文档,这意味着 remove() 实际上确实有效。很高兴看到一些示例代码...
  • 最好的办法是阅读 javadoc。例如Arrays.asList 表示返回的列表具有固定大小,因此您可以想象它的迭代器无法删除。大多数“标准”集合都是可变的并且允许删除。
  • 这是一个真正的问题吗?您是否真的在编写必须处理多种迭代器的代码,这些迭代器可能支持也可能不支持删除?

标签: java interface iterable java-collections-api


【解决方案1】:

数据结构的选择取决于您希望它支持什么,因此当您开始使用它时,作为开发人员的您已经知道底层实现是否支持删除。

如果实际实现不符合您的假设/理解,则会引发异常。

【讨论】:

    【解决方案2】:

    没有办法事先知道这一点。除非已正确记录 remove() 是否受支持(坦率地说,即使它“正确”记录),您唯一确定的方法就是尝试。

    【讨论】:

    • 我对否决票很好奇。在 DV 看来,这个答案的哪一部分是不正确的?
    猜你喜欢
    • 1970-01-01
    • 2023-02-20
    • 1970-01-01
    • 2015-08-15
    • 1970-01-01
    • 2020-07-03
    • 1970-01-01
    • 1970-01-01
    • 2012-12-30
    相关资源
    最近更新 更多