其他分享
首页 > 其他分享> > 如何编写一个遵循Liskov Subsitution和其他SOLID原则的ImmutableMap而没有代码味道?

如何编写一个遵循Liskov Subsitution和其他SOLID原则的ImmutableMap而没有代码味道?

作者:互联网

answered a question报复了一个ImmutableMap.我建议使用代理模式.

这个问题是Map包含一个put方法,它会抛出UnsupportedOperationException.用ImmutableMap替换Map的其他实例会破坏Liskov Subsitution原则.不仅如此,需要声明put和putAll [违反接口隔离原则]

从技术上讲,没有办法用ImmutableMap替换Map实例,因为Map只是一个接口.所以我的问题是:

使用Map接口创建ImmutableMap会被认为是破坏LSP,因为Map包含put和putAll方法吗?是不是将实现Map视为“具有不同接口的替代类”代码味道?如何创建一个遵循LSP而不包含代码味道的ImmutableMap?

解决方法:

在我看来,ImmutableMap应该实现Map.不实现Map是一个坏主意,因为有许多方法接受Map作为参数并且只以只读方式使用它.我不认为这确实违反了Liskov Subsitution原则,因为Map的合同明确表明put是一个可选操作.

实现Map的类必须实现put是不理想的,但是替代方案可能是具有复杂的接口层次结构,每个接口只包括可能的可选方法的子集.如果有n个可选方法,则必须有2 ^ n个接口来覆盖所有组合.我不知道n的值,但是有一些非显而易见的可选操作,例如map.entrySet()返回的Iterator是否支持setValue操作.如果将此层次结构与实际已存在的接口和抽象类的层次结构(包括AbstractMap,SortedMap,NavigableMap,ConcurrentMap,ConcurrentNavigableMap …)组合在一起,您将会陷入混乱.

所以对此没有完美的答案,但在我看来,最好的解决方案是让ImmutableMap实现Map并确保你用Map作为参数编写的每个方法都清楚地记录了Map必须具有的任何属性以及如果错误则抛出的异常传递的地图类型.

标签:java,interface,immutability,code-smell,liskov-substitution-principle
来源: https://codeday.me/bug/20190708/1401101.html