当使用 Guava 时 ImmutableCollection作为函数的参数,最好是要求 ImmutableCollection
作为参数类型:
void <T> foo(ImmutableCollection<T> l)
或者该函数应该采用 Collection<T>
并创建一个不可变的集合本身,如
void <T> foo(Collection<T> l)
{
ImmutableCollection<T> l2 = ImmutableCollection.copyOf(l);
// ...
}
第一个版本似乎更可取,因为调用者确信他传递给函数的映射没有被它修改。但第一个版本需要带有集合的客户端代码才能调用 copyOf()
,即:
Collection collection = map.values();
foo(ImmutableCollection.copyOf(collection));
// instead of simply
foo(collection);
PS:这并不完全正确,因为 ImmutableCollection
没有 copyOf()
但是ImmutableList
和 ImmutableSet
做。
最佳答案
我认为这取决于 foo
是什么函数应该与集合参数有关。
如果
foo
将读取集合元素,然后void <T> foo(Collection<T> l)
更可取,因为它将决定权留给调用者。如果
foo
将集合合并到某个对象的状态中,那么不可变集合可能更可取。然而,我们需要问自己它是否应该是foo
处理此问题的方法的责任,或调用者的责任。
对此没有一个正确的(或“最佳实践”)答案。但是,使用 ImmutableCollection
因为参数的正式类型可能导致复杂性和/或不必要的复制在某些情况下。
关于java - 将 ImmutableCollection 作为参数与创建本地副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187822/