Guava的ImmutableCollection
有像ImmutableList
这样的子类,它们是(不可扩展的)抽象类而不是接口。 documentation说这是为了防止外部亚型。另一方面,文档也说他们
应该被认为是每个重要意义上的接口
但是,外部子类型的能力是不是具有重要的界面感?例如,如果ImmutableList
是一个接口,我可以有一个方法签名
public ImmutableList<String> getNames();
(按照番石榴的建议),然后可以灵活地在未来交换ImmutableList
的自定义实现。但是,由于实际上它是一个抽象类,我没有这种灵活性,因此受到了Guava的实现。因此,如果我想保持这种灵活性,我必须恢复使用更一般的返回类型List
,它不再向调用者传达有关不变性的有用信息:
public List<String> getNames();
那么为什么重要的是这些不是外部子类型的呢?一个答案可能是Guava设计者不信任外部实现者来正确支持所需的语义,但List
本身实际上有相当广泛的契约,没有人阻止自定义实现。还是有其他原因吗?
这是因为如果它是一个接口,就没有办法让ImmutableList
保证不变性。
不,我不认为任何人编写自己的interface
实现的能力是所有接口的必要属性。例如,考虑密封类型,它只允许在同一文件中定义的特定实现集。它们仍然可以是interface
s(有一个提议包括用于Java sealed interface
的here),而不允许世界上任何人创建它们的实现。
我也很好奇为什么你会认为你可能想要自己的自定义实现超简单的东西,如不可变列表。