java - 将 ImmutableCollection 作为参数与创建本地副本

标签 java guava

当使用 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()但是ImmutableListImmutableSet做。

最佳答案

我认为这取决于 foo 是什么函数应该与集合参数有关。

  • 如果 foo将读取集合元素,然后 void <T> foo(Collection<T> l)更可取,因为它将决定权留给调用者。

  • 如果 foo将集合合并到某个对象的状态中,那么不可变集合可能更可取。然而,我们需要问自己它是否应该是 foo处理此问题的方法的责任,或调用者的责任。

对此没有一个正确的(或“最佳实践”)答案。但是,使用 ImmutableCollection因为参数的正式类型可能导致复杂性和/或不必要的复制在某些情况下

关于java - 将 ImmutableCollection 作为参数与创建本地副本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18187822/

相关文章:

java - 为什么 getConfiguration 偶尔会抛出 File不能为空?

java - 带有 Optional 的 Null 安全方法链接

java - 如何使用 Guava 中的 Splitter.MapSplitter 拆分字符串直到特定键?

java - 如何从java字符串中删除控制字符?

java ConcurrentMap 获取空值

java - 即使预期结果正确,JUnit 测试也会失败

java - CopyOnWriteArraySet 太慢

java - 为什么Netty性能不佳?

java - 在java中解析一个非xml文件

java - 按值的数量对 Guava Multimap 进行排序