【发布时间】:2014-05-28 17:13:15
【问题描述】:
我想在获得类型安全的同时返回一个不可修改的集合。尽管我希望它很容易做到,但我似乎找不到它。
假设我有一个类 Foo,其中包含一个 large 类 Bar 集合,它足够大,以至于需要一段时间才能克隆。作为紧密循环的一部分,我希望遍历 Foo 中 Bar 的每个元素,所以我的 Foo 对象上有一个 getBars() 方法
我不想将 foo 中的集合直接传递给调用 getBar() 的人,因为这将允许任何人修改集合,这是不安全的。所以我的选择是
1) 将我的 Foo 集合复制到一个新集合中 2) 返回 Collections.unmodifiableCollections 第一个选项需要复制所有内容,这在紧密循环中代价高昂,而且我预计在返回集合后不需要修改集合。第二个选项做了我想要的,但它并没有让最终用户明白发生的事情。如果后来有人决定出于某种原因修改 getBar 返回的集合,他们将在调用添加或删除的那一刻得到一个异常,这在代码中没有明确记录(是的,API 会记录它,但不是一样)。
我想要的是有一个 UnmodifiableCollection 类,它包装了我的实际集合,并且只使 getter 可见,而 setter 不可见。它会很快,因为它只是包装而不是复制底层集合,并且它会自我记录,您无法修改集合,以后不会出现意外的运行时异常。
我想知道这是否存在!? Guava 似乎很基本,应该有它,但我在任何地方都找不到。如果它不存在,是否有某种原因使我想这样做会更难或更没用? 附言。据我所知,Guava immutableCollections 都会复制基础集合,因此它们相当于上面的选项 1
【问题讨论】:
-
"足够大,克隆需要一段时间" => 多大?除非它有数百万个条目,否则副本会很快。
-
问题是
Collection接口指定了这些方法。因此,您可以拥有一个没有 setter 的类,或者拥有与 Collections 框架兼容的东西。将Collection接口拆分为仅 getter 部分和带有扩展它的 setter 的子接口会很好,但这可能太复杂且不需要包含足够的内容。
标签: java collections