错误的接口实现是否违反里氏替换原则?
Does the wrong interface implementation violate Liskov Substitution Principle?
让我们考虑以下接口实现:
Comparator<String> stringComparator = (o1, o2) -> 0;
是否违反里氏替换原则?
在这个具体案例中,没有。您的示例 Comparator
只是说所有字符串都相等。这满足 Comparator
的合同(参见 javadoc),更广泛地说,它满足 Liskov 可替代性原则 (LSP)。
(这个Comparator
没有用1,很可能是一个错误/错误,但没有违反LSP。)
在更一般的情况下,不满足 Comparator
合同的 Comparator
实现在技术上违反了 LSP。但你也可以说它坏了。您修复它 主要是 因为它坏了/不能正常工作...不是因为某些设计原则。
更一般地说,并非所有违反 LSP 的示例都是损坏的代码。一个例子是 IdentityHashMap
,它(故意且有用地)违反了 Map
的约定,在测试键是否相同时不使用 equals()
。 (它使用 ==
代替。正确地,考虑到 class 的目的。)
违反 LSP 会导致意外行为,但并非所有意外都是错误。
1 - 我想不出使用这个比较器的情况。不是 TreeMap
。不排序...
这个比较器实现了一个完全有效的总顺序。
只需检查公理:
- 对于所有
a
、b
:如果 a <= b
和 b <= a
那么 a = b
是微不足道的(前提无关紧要,结果总是正确的)
- 传递性是微不足道的,因为
a <= b
对于所有 a
、b
- 总数是微不足道的:对于所有
a
、b
,它同时包含 a <= b
和 b <= a
。
因此,即使它与 Liskov 替换原则有任何关系,它仍然只是 Comparator
.
的一个完全有效的实现
让我们考虑以下接口实现:
Comparator<String> stringComparator = (o1, o2) -> 0;
是否违反里氏替换原则?
在这个具体案例中,没有。您的示例 Comparator
只是说所有字符串都相等。这满足 Comparator
的合同(参见 javadoc),更广泛地说,它满足 Liskov 可替代性原则 (LSP)。
(这个Comparator
没有用1,很可能是一个错误/错误,但没有违反LSP。)
在更一般的情况下,不满足 Comparator
合同的 Comparator
实现在技术上违反了 LSP。但你也可以说它坏了。您修复它 主要是 因为它坏了/不能正常工作...不是因为某些设计原则。
更一般地说,并非所有违反 LSP 的示例都是损坏的代码。一个例子是 IdentityHashMap
,它(故意且有用地)违反了 Map
的约定,在测试键是否相同时不使用 equals()
。 (它使用 ==
代替。正确地,考虑到 class 的目的。)
违反 LSP 会导致意外行为,但并非所有意外都是错误。
1 - 我想不出使用这个比较器的情况。不是 TreeMap
。不排序...
这个比较器实现了一个完全有效的总顺序。
只需检查公理:
- 对于所有
a
、b
:如果a <= b
和b <= a
那么a = b
是微不足道的(前提无关紧要,结果总是正确的) - 传递性是微不足道的,因为
a <= b
对于所有a
、b
- 总数是微不足道的:对于所有
a
、b
,它同时包含a <= b
和b <= a
。
因此,即使它与 Liskov 替换原则有任何关系,它仍然只是 Comparator
.