【发布时间】:2015-04-15 15:22:25
【问题描述】:
我知道将所有 List 实现转换为 List 是普遍接受的。无论是变量、方法返回,还是使用ArrayList、CopyOnWriteArrayList等的方法参数。
List<Market> mkts = new ArrayList<>();
当我使用 Guava ImmutableList 时,我感觉它可以说是这条规则的一个例外(特别是如果我正在构建内部的复杂业务应用程序而不是公共 API)。因为如果我将其降级为列表,已弃用的 mutator 方法将不再被标记为已弃用。此外,它不再被识别为不可变对象,这是其功能和身份的重要组成部分。
List<Market> mkts = ImmutableList.of(mkt1,mkt2,mkt3);
因此,将其作为ImmutableList 传递是有意义的,对吧?我什至可以争辩说,内部 API 只接受 ImmutableList 是一个很好的策略,因此客户端的可变性和多线程不会破坏库中的任何内容。
ImmutableList<Market> mkts = ImmutableList.of(mkt1,mkt2,mkt3);
我知道ImmutableList 本身存在被弃用的风险,而甲骨文决定创建自己的ImmutableList 的那一天将需要大量重构。但是,维持ImmutableList 演员阵容的利大于弊是否值得商榷?
【问题讨论】:
-
在这种情况下,我将直接使用
ImmutableList<Whatever>。如果 Oracle 实现了这样的类,正在进行的重构不应该让你担心,否则我们都害怕将来发生变化,并且不会生成代码。 -
说得很好,路易吉。而当我实现
ImmutableList时,我很少遇到需要稍后将其切换为可变列表实现的情况。当我制作不可变的东西时,应用程序的整个结构都是围绕它不可变这一事实构建和优化的。 -
另一种选择是使用
List<? extends Market>作为列表的类型。它会给你一点编译器强制的不变性——例如,你不能调用mkts.add(new Market())。但这并没有像ImmutableList那样声明意图
标签: java collections guava