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 segregation
和 Liskov substitution
原则?
实现可能选择不支持其所有方法的 Map 接口文档,这使得 Collections.unmodifiableMap
return 成为满足接口契约的实现。
虽然接口以这种方式实现其方法 "optional" 并不常见,但这是一种在实践中工作得很好的设计折衷。大多数集合应该只写一次然后一次又一次地读取,所以修改地图的代码通常是创建它的代码并且知道它是可变的。
关于 ISP,Bob Martin 可能会考虑 Collections.unmodifiableMap()
产生与他的 stack class example 相同的违规行为。它将客户端暴露给他们不需要的界面,实际上无法使用。
如前所述,接口文档满足LSP
最近在看Java Concurrency in Practice
,第一次接触Collections.unmodifiableMap(...)
方法。该方法围绕现有 Map
创建一个只读包装器,任何修改返回的 Map
的尝试都将(根据 Javadocs
)导致抛出 UnsupportedOperationException
。其他集合 类.
这让我很担心,因为一个unmodifiableMap()
仍然是returns一个Map
,但并不支持所有相关方法。事实上,它也会在写操作时抛出异常,这意味着它不能在大多数应用程序中替代 "proper" Map
。
我是一名学生,对自己识别设计缺陷的能力还没有信心,但这些是否分别违反了 Interface segregation
和 Liskov substitution
原则?
实现可能选择不支持其所有方法的 Map 接口文档,这使得 Collections.unmodifiableMap
return 成为满足接口契约的实现。
虽然接口以这种方式实现其方法 "optional" 并不常见,但这是一种在实践中工作得很好的设计折衷。大多数集合应该只写一次然后一次又一次地读取,所以修改地图的代码通常是创建它的代码并且知道它是可变的。
关于 ISP,Bob Martin 可能会考虑 Collections.unmodifiableMap()
产生与他的 stack class example 相同的违规行为。它将客户端暴露给他们不需要的界面,实际上无法使用。
如前所述,接口文档满足LSP