Java 8在接口上引入了默认方法,以提供对集合接口实现的向后兼容性,避免遗留库中出现MethodNotFound错误。例如,一个具有java 7 List实现的库将不会实现 stream() 方法。如果java 8代码使用此库,则默认实现提供后备。
实际上,我看到很多开发人员过度使用这个特性来模拟混入和多重继承,这种风格类似于scala trait。
我的一个担忧是,这种编程风格模糊了接口(即契约)和它们的实现之间的界限,因此引入了隐藏的紧密耦合,并违反了控制反转,迫使我在单元测试中覆盖默认实现,以抑制不应该存在于单元测试级别的行为。
这种使用默认方法的方式是否是反模式,还是只有我怀疑它?