- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
当使用 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/
我想构建一个传递迭代器和大小的数据模型,基本上是一种迭代结果集元素的只读方式。 我认为扩展 ImmutableCollection 并实现 size() 和 iterator() 是最好的做法,因为这
我很难理解 java-9 ImmutableCollections.SetN 的实现细节;具体为什么需要将内部数组增加两次。 假设你这样做: Set.of(1,2,3,4) // 4 elements
当对字符串的 ImmutableSet 调用 .contains() 时,比较是否区分大小写?下面的示例代码中,“foo”、“Foo”、“FOO”的参数key会返回false吗? public cla
我有一个场景,其中 channel 从网关触发,ImutableList 被传递到进一步的 SI 链。但是从网关触发SI链的步骤失败了。进一步调查错误原因,我发现失败是因为 SI 试图将源对象转换为目
当使用 Guava 时 ImmutableCollection作为函数的参数,最好是要求 ImmutableCollection作为参数类型: void foo(ImmutableCollectio
我很难理解 java-9 ImmutableCollections.SetN 的实现细节;特别是为什么需要将内部数组增加两次。 假设你这样做: Set.of(1,2,3,4) // 4 element
我的理解是 DTO 序列化为 GWT RPC出于性能原因,应该声明其字段的最低可能实现类型。例如,人们应该更喜欢 ArrayList 而不是 List 或 Collection,这与我们通常收到的相反
Guava 的 ImmutableCollection 有像 ImmutableList 这样的子类,它们是(不可扩展的)抽象类而不是接口(interface)。 documentation说这是为了
我想执行以下操作: List list = IntStream.range(0, 7).collect(Collectors.toList()); 但在某种程度上,结果列表是 Guava 的 Immu
我是一名优秀的程序员,十分优秀!