5

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

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

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

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

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

4

1 回答 1

0

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

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

我会假设上面的重点是兼容性(不过,让我们面对现实吧,上面很模糊)。对于使用像 trait 这样的默认值没有明显的编译“限制”,我注意到有许多教程支持default在这种情况下使用 (无论好坏)。但是肯定有一些陷阱(例如,它们不等同于 Scala 的特征)。请参阅下面的@brian-goetz 的答案以获得更全面的讨论:

Java 8 默认方法作为特征:安全吗?

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

于 2021-01-04T11:44:54.977 回答