Java接口中的默认方法是否是一种反模式?

6

Java 8在接口上引入了默认方法,以提供对集合接口实现的向后兼容性,避免遗留库中出现MethodNotFound错误。例如,一个具有java 7 List实现的库将不会实现 stream() 方法。如果java 8代码使用此库,则默认实现提供后备。

实际上,我看到很多开发人员过度使用这个特性来模拟混入和多重继承,这种风格类似于scala trait。

我的一个担忧是,这种编程风格模糊了接口(即契约)和它们的实现之间的界限,因此引入了隐藏的紧密耦合,并违反了控制反转,迫使我在单元测试中覆盖默认实现,以抑制不应该存在于单元测试级别的行为。

这种使用默认方法的方式是否是反模式,还是只有我怀疑它?


2
你的问题是关于“default”方法特性,正如你的标题所示,还是关于你在问题描述中提到的“实践中看到的编程风格”?请澄清一下。 - Holger
1个回答

0

来自Oracle的文档: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html

默认方法使您能够向库的接口添加新功能,并确保与旧版本接口的代码具有二进制兼容性。

我认为上面的重点在于兼容性(尽管,让我们面对现实,上面的内容非常模糊)。使用默认值(default)像特征一样似乎没有明显的编译“限制”,我注意到有很多教程倡导在该上下文中使用default(无论好坏)。然而,它们肯定存在一些缺陷(例如,它们不等同于Scala的特征)。请参见@brian-goetz在下面的回答中,进行更全面的讨论:

Java 8 default methods as traits : safe?

简而言之:如何使用default将决定它是否最终成为反模式。因此,回答您的问题,它可能被某些人过度使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接