Pet*_*Pro 9 java immutability guava
Guava的ImmutableCollection子类ImmutableList是(不可扩展的)抽象类,而不是接口。该文件说,这是为了防止外部亚型。另一方面,文档还说
应该被认为是每个重要意义上的接口
但是,在外部进行子类型化的功能不是一种重要的界面含义吗?例如,如果ImmutableList是一个接口,我可以有一个方法签名,例如
public ImmutableList<String> getNames();
Run Code Online (Sandbox Code Playgroud)
(就像Guava的建议一样),然后可以灵活地ImmutableList将来交换自定义实现。但是,由于实际上它是一个抽象类,所以我没有这种灵活性,因此必须绑定到Guava的实现。因此,如果我想保持这种灵活性,就不得不使用更通用的return类型List,该类型不再向调用者传达有关不变性的有用信息:
public List<String> getNames();
Run Code Online (Sandbox Code Playgroud)
那么为什么不从外部进行子类型化很重要?一个答案可能是Guava设计者不信任外部实现者来适当地支持所需的语义,但List实际上它本身具有相当广泛的约定,而且没人阻止这种定制实现。还是还有其他原因?
这是因为ImmutableList如果是接口,则无法保证类型不变。
不,我认为任何人都无法编写自己的实现的实现interface是所有接口的必要属性。例如,考虑密封类型,它仅允许在同一文件中定义的一组特定实现。他们仍然可以interface秒(有包括建议sealed interface对Java 在这里),而不允许在世界上任何人来创建它们的实现。
对于为什么会认为您可能想要自己定制的超简单的东西(如不可变列表)的实现,我也真的感到很好奇。
| 归档时间: |
|
| 查看次数: |
177 次 |
| 最近记录: |