【发布时间】:2014-02-26 19:06:44
【问题描述】:
Liskov Substitution principle是SOLID的原则之一。我已经多次阅读这个原则并试图理解它。
这是我的想法,
这个原则与强大的行为契约有关 类的层次结构。子类型应该可以替换为 超类型而不违反合同。
我也读过一些其他的articles,我对这个问题有点迷茫。 Collections.unmodifiableXXX() 方法不违反 LSP 吗?
摘自上面链接的文章:
换句话说,当通过其基类接口使用对象时, 用户只知道基础的前置条件和后置条件 班级。因此,派生对象不能期望这些用户服从 比基类要求的更强大的先决条件
我为什么这么认为?
之前
class SomeClass{
public List<Integer> list(){
return new ArrayList<Integer>(); //this is dumb but works
}
}
之后
class SomeClass{
public List<Integer> list(){
return Collections.unmodifiableList(new ArrayList<Integer>()); //change in implementation
}
}
我无法更改 SomeClass 的实现以在将来返回不可修改的列表。编译将起作用,但如果客户端以某种方式尝试更改返回的 List,那么它将在运行时失败。
这就是 Guava 为集合创建单独的ImmutableXXX 接口的原因吗?
这不是直接违反了 LSP 还是我完全搞错了?
【问题讨论】:
-
很好的链接。谢谢@Marco13
标签: java oop collections liskov-substitution-principle