根据接口隔离原理
不应强迫客户端实现不需要的接口方法。
...and,因此我们应该定义接口以实现逻辑分离。
但是Java 8中引入的default方法提供了在Java接口中实现方法的灵活性。Java 8似乎提供了增强接口的可行性,使其具有一些与其核心逻辑无关的方法,但具有一些默认或空的实现。
这不违反ISP吗?
发布于 2017-10-03 09:07:21
问得好。当然,它违反了接口隔离原则,我个人不喜欢默认实现的概念,因为它破坏了接口设计的美,也破坏了一些精确的多态性。如果有人不知道ISP的概念,那么他们就会开始设计胖接口,最终会像包装在一个接口中的所有东西一样。在代码设计过程中,人们也不会考虑逻辑上的问题。
这将导致代码的气味,我相信那些不知道这些概念的人会开始编写糟糕的代码。我认为默认实现是一个不想要的特性,因为它会让人们编写出难闻的代码。
发布于 2020-06-03 14:42:37
如果您打算这样做,ISP将被违反。您可以隔离这些接口,以只完成单一的职责。特定责任的一组方法很可能会遵循80-20条规则。您可以为80%的部分中的40-50%的方法提供默认实现。这个40-50%的部分将是很少使用的部分,因此默认设置是可以的。如果接口完成单一的责任,它们很少会太大,而且大多数情况下都是在ISP中。
发布于 2021-07-23 13:10:31
不是的。
事实上,默认方法可以是提供额外有用功能的好方法,同时避免违反ISP。
这是我更长的答案here的摘录
标准库中有好的使用default方法的例子。其中之一是java.util.function.Function及其andThen(...)和compose(...)方法。..。
这些默认方法并不违反ISP,因为实现Function的类不需要调用或覆盖它们。可能有很多用例--一些具体的函数实例从来没有调用过它们的andThen(...)方法,但这很好--您不会通过提供有用但非必要的功能来破坏ISP,只要您不对所有这些用例进行限制--用它来强制他们做一些事情。在函数的情况下,将这些方法作为抽象方法而不是默认方法提供将违反ISP,因为所有实现类都必须添加自己的实现,即使它们知道不太可能被调用。
https://stackoverflow.com/questions/46377594
复制相似问题