【发布时间】:2015-10-23 06:06:41
【问题描述】:
是否有任何理由/论据不实现基于谓词/约束来限制其成员的 Java 集合?
鉴于这种功能应该经常是必需的,我期待它已经在 apache-commons 或 Guava 等集合框架上实现。但是虽然apache indeed had it、Guava deprecated its version of it 并建议不要使用类似的方法。
Collection interface contract 声明一个集合可以对其元素设置任何限制,只要它被正确记录,所以我无法理解为什么不鼓励使用受保护的集合。还有什么其他选择可以确保 Integer 集合在不隐藏整个集合的情况下从不包含负值?
【问题讨论】:
-
@dcsohl 对于
Collections.unmodifiable*(...)集合可以给出相同的论点(尽管有人可能会争论这是否不仅仅是某些特定语言缺陷的暗示)。 @biziclop 有趣的是,add方法已经允许在 "...元素的某些属性阻止它被添加到此集合" 的情况下抛出IllegalArgumentException。所以我也没有看到不使用这样一个集合的深刻技术原因。 -
弃用注释表明Preconditions 是约束的替代品。
-
这样的
List可能效率低下。例如Collections.swap将检查这两个项目的谓词,即使它们都已经在List中。您无法覆盖此行为,因为它是static。例如,这可能会对Collections.sort的性能产生重大影响。 -
@biziclop 实际上,
add()在这种情况下更进一步。但是我看不到一种方法可以让我既公开一个漂亮的集合接口又将验证封装在正确的类中。无论如何,我都必须公开类似集合的行为,所以我宁愿利用 Collection/List 接口。 -
@gcscaglia 好吧,如果你愿意,你真的可以。只是无论出于何种原因,Guava 开发人员都没有发现它是一个足够常见的问题(或足够好的解决方案),无法将其保留在他们的库中。
标签: java collections constraints predicate