Java 8在接口上引入了默认方法,以便为集合接口的实现提供向后兼容性,以避免遗留库上的MethodNotFound错误。
即具有List 7的java 7实现的库将不实现stream()方法。如果java 8代码使用此库,则默认实现提供后备。
我在实践中看到的是,许多开发人员过度使用此功能来模拟混合和多重继承,其风格类似于scala特征。
我担心的一个问题是这种编程风格模糊了界面(即合同)和它们的实现之间的界限,因此引入了隐藏的紧耦合并违反了控制反转,迫使我使用后门通过覆盖来测试代码单元测试中的默认实现,用于抑制单元测试级别不应出现的行为。
这种默认方法的使用是反模式,还是我一个人怀疑这个?
答案 0 :(得分:0)
来自 Oracle 的文档: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html
<块引用>默认方法使您能够向库的接口添加新功能,并确保与为这些接口的旧版本编写的代码的二进制兼容性。
我认为上面的重点是兼容性(尽管,让我们面对现实,上面的内容非常模糊)。使用像 trait 这样的默认值没有明显的编译“限制”,我注意到有许多教程支持在这种情况下使用 default
(无论好坏)。然而,肯定有一些问题(例如,它们并不等同于 Scala 的特性)。有关更全面的讨论,请参阅下方 @brian-goetz 的回答:
Java 8 default methods as traits : safe?
简而言之:如何使用 default
将决定它是否最终是一种反模式。因此,为了回答您的问题,它可能被某些人过度热情地使用了。