gpt4 book ai didi

java - 为什么不是 Guava ImmutableCollections 接口(interface)?

转载 作者:塔克拉玛干 更新时间:2023-11-03 03:20:16 25 4
gpt4 key购买 nike

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

should be thought of as interfaces in every important sense

但是外部子类型的能力不是接口(interface)的重要意义吗?例如,如果 ImmutableList 是一个接口(interface),我可以有一个像

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

(正如 Guava 推荐的那样),然后在将来可以灵活地交换 ImmutableList 的自定义实现。然而,由于实际上它是一个抽象类,我没有这种灵 active ,因此只能使用 Guava 的实现。因此,如果我想保持这种灵 active ,就必须恢复使用更通用的 List 返回类型,它不再向调用者传达有关不变性的有用信息:

public List<String> getNames();

那么为什么不对这些进行外部子类型化很重要?一个答案可能是 Guava 设计者不信任外部实现者来正确支持所需的语义,但 List 本身实际上有相当广泛的契约(Contract),并且没有人阻止它的自定义实现。还是有其他原因?

最佳答案

这是因为 ImmutableList 类型如果是接口(interface)就无法保证不变性。

不,我不认为任何人编写自己的 interface 实现的能力是所有接口(interface)的必要属性。例如,考虑密封类型,它只允许在同一文件中定义的一组特定实现。它们仍然可以是 interface(有一个提案包括用于 Java 的 sealed interface here),不允许世界上任何人创建它们的实现。

我也很好奇为什么您认为您可能想要自己的自定义实现一些 super 简单的东西,比如不可变列表。

关于java - 为什么不是 Guava ImmutableCollections 接口(interface)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55802642/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com