【发布时间】:2020-01-15 04:33:08
【问题描述】:
java 中List.of(E... elements) 方法返回的列表确实返回了一个不可变列表,但是通过查看创建的列表根本看不到它。创建的列表只是抛出一个异常,而不是根本不显示更改列表的可能性。
我的意思是,List.of(E... elements) 应该返回一个ImmutableList 那个extends List。通过这种方式,用户可以决定他是否愿意展示这个不变性的事实。
但我没有发现任何人抱怨或展示替代解决方案。甚至 Guava 和 Apache Commons 默认也不这样做。只有 Guava 提供了创建它的可能性(尽管有很多代码):
List<String> list = new ArrayList<String>(Arrays.asList("one", "two", "three"));
ImmutableList<String> unmodifiableList = ImmutableList.<String>builder().addAll(list).build();
但即使是这个类也有一个(已弃用的)add 和 remove 方法。
谁能告诉我为什么没人关心这个(看似基本的)问题?
【问题讨论】:
-
好的 .. 为什么你认为应该这样做?为什么你认为如果某件事没有按照你想象的方式工作,那它是错的还是坏的?
-
好吧,
List.of(...)是一个标准的 JDK 类,而ImmutableList是像 Guava 这样的第三方库的一部分。List.of(...)为什么要返回这样的列表? -
扩展 List 的不可变集合都违反了 Liskov 替换原则——它们声明的返回类型不会改变这一点,它一开始就被破坏了,并且没有真正的方法来修复它(不改变什么 @ 987654331@其实是)
-
"(尽管有很多代码)" 好消息,你不需要所有的代码,
ImmutableList.copyOf(list)或ImmutableList.of("one", "two", "three")也一样。
标签: java collections guava apache-commons