java接口中的默认方法是否为反模式?

时间:2016-12-16 11:53:53

标签: java-8 inversion-of-control mixins anti-patterns default-method

Java 8在接口上引入了默认方法,以便为集合接口的实现提供向后兼容性,以避免遗留库上的MethodNotFound错误。

即具有List 7的java 7实现的库将不实现stream()方法。如果java 8代码使用此库,则默认实现提供后备。

我在实践中看到的是,许多开发人员过度使用此功能来模拟混合和多重继承,其风格类似于scala特征。

我担心的一个问题是这种编程风格模糊了界面(即合同)和它们的实现之间的界限,因此引入了隐藏的紧耦合并违反了控制反转,迫使我使用后门通过覆盖来测试代码单元测试中的默认实现,用于抑制单元测试级别不应出现的行为。

这种默认方法的使用是反模式,还是我一个人怀疑这个?

1 个答案:

答案 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 将决定它是否最终是一种反模式。因此,为了回答您的问题,它可能被某些人过度热情地使用了。