让我们考虑以下接口实现:
Comparator<String> stringComparator = (o1, o2) -> 0;
是否违反Liskov替代原则?
答案 0 :(得分:1)
在这个特定情况下,没有。您的示例Comparator
只是说所有字符串都相等。这满足了Comparator
的合同(参见javadoc),更广泛地说它满足Liskov替代性原则(LSP)。
(这个Comparator
没有用 1 ,可能是错误/错误,但LSP没有被违反。)
在更一般的情况下,一个不满足Comparator
合同的Comparator
实现在技术上违反了LSP。但你也可以说它已经坏了。你修复它主要因为它被破坏/赢得了正常工作......不是因为某些设计原则。
更一般地说,并非所有LSP违规的例子都是破坏的代码。一个例子是IdentityHashMap
,在测试密钥是否相同时(故意和有用)违反了Map
的合同,而不是使用equals()
。 (它使用==
代替。正确地说,考虑到类的目的。)
LSP违规可能导致意外行为,但并非所有意外都是错误。
1 - 我无法想到使用这种比较器是明智的。不是TreeMap
。没有排序......
答案 1 :(得分:0)
此比较器实现完全有效的总订单。
检查公理:
a
,b
:如果a <= b
和b <= a
则a = b
是微不足道的(前提无所谓,后果始终为真)a <= b
适用于所有a
,b
a
,b
,它同时包含a <= b
和b <= a
。所以,即使它与Liskov的替换原则有关,它仍然只是Comparator
的完全有效的实现。