我qazxsw poi关于qazxsw poi。我建议使用代理模式。
这个问题是answered a question包含一个ImmutableMap
方法,它将抛出Map
。用put
取代UnsupportedOperationException
的其他实例将打破Liskov Subsitution原则。不仅如此,需要声明Map
和ImmutableMap
[违反界面隔离原则]
从技术上讲,没有办法用put
替换putAll
实例,因为Map
只是一个接口。所以我的问题是:
使用ImmutableMap
接口创建Map
会被视为打破LSP,因为ImmutableMap
包含Map
和Map
方法?不实现put
被认为是“具有不同接口的替代类”代码味道?如何创建一个遵守LSP但却不包含代码味道的putAll
?
在我看来,Map
应该实施ImmutableMap
。不实现ImmutableMap
是一个坏主意,因为有许多方法接受Map
作为参数,并且只在只读意义上使用它。我不相信这确实违反了Liskov Subsitution原则,因为Map
的合同明确表明Map
是一项可选操作。
实现Map
的类必须实现put
并不理想,但是替代方案可能是具有复杂的接口层次结构,每个接口只包括可能的可选方法的子集。如果有Map
可选方法,则必须有put
接口来覆盖所有组合。我不知道n
的值,但是有一些非显而易见的可选操作,例如2^n
返回的n
是否支持Iterator
操作。如果你将这个层次结构与实际已经存在的接口和抽象类的层次结合起来(包括map.entrySet().iterator()
,setValue
,AbstractMap
,SortedMap
,NavigableMap
......),那么你就会陷入混乱。
所以没有完美的答案,但在我看来,最好的解决方案是让ConcurrentMap
实现ConcurrentNavigableMap
并确保你用ImmutableMap
作为参数编写的每个方法都清楚地记录了Map
必须具有的任何属性以及如果错误则抛出异常通过Map
的类型。