Collections.unmodifiableMap(和其他人)是否违反了 SOLID 原则?

Does Collections.unmodifiableMap (and others) violate SOLID principles?

最近在看Java Concurrency in Practice,第一次接触Collections.unmodifiableMap(...)方法。该方法围绕现有 Map 创建一个只读包装器,任何修改返回的 Map 的尝试都将(根据 Javadocs)导致抛出 UnsupportedOperationException。其他集合 类.

也存在类似的方法

这让我很担心,因为一个unmodifiableMap()仍然是returns一个Map,但并不支持所有相关方法。事实上,它也会在写操作时抛出异常,这意味着它不能在大多数应用程序中替代 "proper" Map

我是一名学生,对自己识别设计缺陷的能力还没有信心,但这些是否分别违反了 Interface segregationLiskov substitution 原则?

实现可能选择不支持其所有方法的 Map 接口文档,这使得 Collections.unmodifiableMap return 成为满足接口契约的实现。

虽然接口以这种方式实现其方法 "optional" 并不常见,但这是一种在实践中工作得很好的设计折衷。大多数集合应该只写一次然后一次又一次地读取,所以修改地图的代码通常是创建它的代码并且知道它是可变的。

关于 ISP,Bob Martin 可能会考虑 Collections.unmodifiableMap() 产生与他的 stack class example 相同的违规行为。它将客户端暴露给他们不需要的界面,实际上无法使用。

如前所述,接口文档满足LSP