我只是在学习Java,所以我很难获得可能的替代方案,以及这种设计决策的影响。
Java 8将默认方法功能添加到接口,这允许接口具有实现。 这允许使用新方法扩展现有接口,而不会破坏客户端,以向后兼容的方式随时间演变接口。 但是,给定默认实现,此类扩展有些限制,并且可能使用接口或库方法的现有接口方法来实现。 所以我的问题是
答案 0 :(得分:12)
为什么要引入此语言功能?
它的添加主要是为了让您可以在不破坏每个人的代码的情况下向已经使用的现有界面添加方法,还可以共享方法实现"水平"跨类实现相同的接口(而不是"垂直"通过继承共享)。
它支持哪些关键新功能? (例如
Splititerators
)
java.util.Collection<T>.stream()
还有哪些其他选择来支持这些语言功能?例如,为什么不创建扩展
的新界面SplitIterable
?Iterable
您可以选择全新的接口,并继续使用关联的静态助手类(例如Collection<T>
接口及其Collections
助手类)。这不会很糟糕 - 实际上,有人可能会认为默认方法纯粹是静态方法 * 之上的语法糖。但是,默认方法通常提供更好的可读性。
实施这些替代方案会产生什么影响(接口的扩散?)
你最终会得到一个不太一致的库和一种不太可读的语言,但它不会成为世界末日。正如Joachim Sauer所指出的,更大的问题是接口实现无法覆盖静态助手类的实现。这会带走灵活性。
我是否可以在第一版界面中为方法提供默认实现,以便可以将其作为其他方法的组合实现?
只有当您需要共享实施&#34;水平&#34;时才应该这样做。如果方法提供了实现的基本行为,请不要为其提供默认值。
* 这将过于简单化,因为默认方法仍然是虚拟的。感谢Brian Goetz发表评论。