java (JEP 269)的List.和(guava)的ImmutableList.之间的区别是什么[已关闭]

unhi4e5o  于 2023-02-18  发布在  Java
关注(0)|答案(1)|浏览(111)

已关闭。此问题需要details or clarity。当前不接受答案。
**想要改进此问题?**添加详细信息并通过editing this post阐明问题。

2天前关闭。
Improve this question
Java 9定义 *JEP 269:用于集合的便利工厂方法 * 和用于集合的新工厂方法。
我们在测试中使用com.google.common.collect来创建不可变集合,但是有什么区别呢?
java.util.List.of

List<String> words = List.of("a", "b", "c");

以及
com.google.common.collect.ImmutableList.of

List<String> words = ImmutableList.of("a", "b", "c");

它只是Java标准版本的Guava集合工厂吗?
值得把所有东西都放进java.util.List.of吗?

qacovj5a

qacovj5a1#

在示例中使用时,它们基本上是等效的(除了一些细微的差异)。
值得注意的是,ImmutableList(及其of方法)* 在 * Java引入List.of()之前就已经存在了,如果Java更早地拥有List.of,它很可能就不会被开发出来(或者至少不会变得如此流行)。
首先,它们有何相似之处:

  • 它们都返回List<T>
  • 它们都是不可变的(即不允许任何突变)
  • 它们都不允许null

此时最大的实际差异是ImmutableList.of实际上返回一个ImmutableList<T>(它当然实现了List<T>)。
如果你想写一个只能接受不可变列表的方法,这是相关的:

public void frobnicate(ImmutableList<T> stuff)

这个方法可以做任何事情,并且知道它保证stuff的内容不会改变(当然,其中的单个可变对象可能会改变,但其中的哪些对象不会改变)。
对于List<T>List.of()的返回类型),没有类型系统级别的信息告诉您这个列表是不可变的。

**评论时间:**使用JDK标准特性是有价值的,所以我会避免使用ImmutableList,除非类型信息部分对于特定用例是 * 非常重要的 *。但是IMO通常可以通过编写一个方法来解决,期望它的参数不会发生变化(无论如何,这是一个非常常见的假设)。

相关问题