Java 10的发布带来了新的静态工厂方法,特别是:
static <E> List<E> copyOf(Collection<? extends E> coll)
static <E> Set<E> copyOf(Collection<? extends E> coll)
static <K,V> Map<K,V> copyOf(Map<? extends K,? extends V> map)
由于这些方法允许我们将Collection
复制到不同的Collection
实现中,它们如何与现有方法进行比较和对比?
答案 0 :(得分:7)
正如List#of
,Set#of
和Map#ofEntries
允许我们在Java 9中创建不可修改的实现一样,copyOf
方法提供了方便从现有的Collection
和Map
创建不可修改的实现的方法(取决于方法,因为Map#copyOf
在Java 10中接受Map
)
这使我们可以轻松地从Set<E>
创建不可修改的 List<E>
,反之亦然。
尽管如此,这些方法带来了一些警告(引用java.util.List
的{{3}}):
- 他们是不可修改的。无法添加,删除或替换元素。在List上调用任何mutator方法将始终导致抛出UnsupportedOperationException。但是,如果包含的元素本身是可变的,则可能导致列表内容看起来发生变化。
- 他们不允许使用null元素。尝试使用null元素创建它们会导致NullPointerException。
- 如果所有元素都是可序列化的,则它们是可序列化的。
- 列表中元素的顺序与提供的参数或提供的数组中元素的顺序相同。
- 他们是以价值为基础的。调用者不应对返回实例的身份做出任何假设。工厂可以自由创建新实例或重用现有实例。因此,对这些实例的身份敏感操作(引用相等(==),身份哈希代码和同步)是不可靠的,应该避免。
- 按序列化表格页面上的指定序列化它们。
有关Set#copyOf
和Map#copyOf
的警告,请参阅他们的文档。