首页 > 解决方案 > Collections.unmodifiableMap (和其他)是否违反了 SOLID 原则?

问题描述

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

这让我很担心,因为 anunmodifiableMap()仍然返回 a Map,但不支持所有相关方法。它还在写操作上引发异常的事实意味着它不能Map在大多数应用程序中替换“正确”。

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

标签: javaoopsolid-principles

解决方案


Map 接口记录了实现可以选择不支持它的所有方法,这使得Collections.unmodifiableMap返回一个满足接口契约的实现。

虽然接口以这种方式实现其方法“可选”是不寻常的,但这是一种设计折衷,在实践中效果很好。大多数集合应该只编写一次,然后一次又一次地读取,因此修改映射的代码通常是创建它的代码并且知道它是可变的。


推荐阅读