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