为什么不提供Guava ImmutableCollections接口?

时间:2019-04-23 00:17:14

标签: java guava immutability

番石榴的ImmutableCollection具有像ImmutableList这样的子类,它们是(不可扩展的)抽象类,而不是接口。 documentation表示这是为了防止外部子类型化。另一方面,文档还说他们

  

应该被视为每个重要意义上的接口

但是,在外部进行子类型化的功能不是一种重要的界面含义吗?例如,如果ImmutableList是一个接口,我可以使用

这样的方法签名
public ImmutableList<String> getNames();

(就像Guava的建议一样),以后可以灵活地交换ImmutableList的自定义实现。但是,由于实际上它是一个抽象类,所以我没有这种灵活性,因此必须绑定到Guava的实现。因此,如果我想保持这种灵活性,就不得不转而使用更普遍的返回类型List,它不再向调用者传达有关不变性的有用信息:

public List<String> getNames();

那么为什么不从外部进行子类型化很重要?一个答案可能是Guava设计者不信任外部实现者来适当地支持所需的语义,但是List本身实际上具有广泛的约定,没有人阻止对此的定制实现。还是还有其他原因?

1 个答案:

答案 0 :(得分:7)

这是因为如果类型ImmutableList是接口,则无法保证其不变性。

不,我认为任何人都无法编写自己的interface实现是所有接口的必要属性。例如,考虑密封类型,它仅允许在同一文件中定义的一组特定实现。它们仍然可以是interface(对于Java here来说,其中包括sealed interface的提议),而世界上没有任何人可以创建它们的实现。

对于您为什么会认为自己可能想要自己的超简单事物(如不可变列表)的自定义实现,我也很好奇。