我answered a question regaurding一ImmutableMap
。我建议使用代理模式。如何编写一个不带代码味道的遵循Liskov置换和其他SOLID原则的ImmutableMap?
问题在于Map
包含put
方法,该方法会抛出UnsupportedOperationException
。用ImmutableMap
代替Map
的其他实例将打破Liskov的替代原则。不仅如此,需要申报put
和putAll
[违反接口隔离原则]
从技术上讲,是没有办法用ImmutableMap
更换Map
例如,由于Map
是一个简单的接口。所以我的问题是:
将使用Map
接口被认为是打破了LSP创建ImmutableMap
,因为Map
包含put
和putAll
方法?不会执行Map
被认为是“具有不同接口的替代类”的代码味道?如何创建一个遵循LSP但不包含代码异味的ImmutableMap
?
['Map.put'](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html?is-external=true#put%28K,%20V% 29)和['Map.putAll'](http://docs.oracle.com/javase/7/docs/api/java/util/Map.html#putAll%28java.util.Map%29)(以及作为“删除”和“清除”)被定义为“可选操作”。此外,在接口文档中指定了从实现类抛出UnsupportedOperationException的可能性。 –
@MickMnemonic但是这违反了[接口隔离原则](http://en.m.wikipedia.org/wiki/Interface_segregation_principle),其中声明“*不应强迫客户端依赖于它不使用的方法*”。我将编辑该问题,以包括它应该遵循其他SOLID原则 –
我的观点是,这些变异方法的契约至少在'Map'接口中有很好的记录。但你有一个非常有用的观点; 'Map'接口是_fat_之一。也许它本来应该被拆分成'Map'和'ModifiableMap extends Map'。 –