Java 8 java接口中的默认方法是反模式吗?

Java 8 java接口中的默认方法是反模式吗?,java-8,inversion-of-control,mixins,anti-patterns,default-method,Java 8,Inversion Of Control,Mixins,Anti Patterns,Default Method,Java8在接口上引入了默认方法,为集合接口的实现提供向后兼容性,以避免遗留库上的MethodNotFound错误 i、 e使用java 7实现List的库不会实现stream()方法。如果Java8代码使用这个库,那么默认实现提供了一个回退 我在实践中看到的是,许多开发人员过度热衷于使用此功能,以类似scala特性的方式模拟混合插入和多重继承 我的一个担忧是,这种编程风格模糊了接口(即合同)及其实现之间的界限,因此引入了隐藏的紧耦合,违反了控制反转,迫使我在单元测试中重写默认实现,使用后门来测

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

i、 e使用java 7实现List的库不会实现stream()方法。如果Java8代码使用这个库,那么默认实现提供了一个回退

我在实践中看到的是,许多开发人员过度热衷于使用此功能,以类似scala特性的方式模拟混合插入和多重继承

我的一个担忧是,这种编程风格模糊了接口(即合同)及其实现之间的界限,因此引入了隐藏的紧耦合,违反了控制反转,迫使我在单元测试中重写默认实现,使用后门来测试代码,抑制单元测试级别不应出现的行为


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

来自Oracle文档:

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

我假设重点是上述内容中的兼容性(尽管,让我们面对现实,上述内容相当模糊)。对于像trait一样使用默认值,没有明显的编译“限制”,我注意到有许多教程支持在该上下文中使用
default
(无论好坏)。然而,确实存在一些缺陷(例如,它们并不等同于Scala的特征)。有关更全面的讨论,请参见下文@brian goetz的答案:


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

你的问题是关于
默认方法功能,正如你的标题所示,还是关于你“在实践中看到的”编程风格,如你的问题主体所述?