为什么在Java 8中为接口添加默认方法是一个很好的设计选择,什么是替代

参见英文答案 > Purpose of Default or Defender methods in Java 8                                    4个
我只是学习Java,所以很难找到可能的替代方案,以及这样的设计决策的影响.

Java 8将默认方法功能添加到接口,这允许接口具有实现.
这允许使用新方法扩展现有接口,而不会破坏客户端,并以向后兼容的方式随时间推进接口.
然而,给定的默认实现,这样的扩展有一些限制,并且可能使用接口或库方法的现有接口方法来实现.
所以我的问题是

>为什么这个语言功能被引入?
>它支持哪些关键的新功能? (例如Splititerators)
>还有什么替代方案可以支持这些语言功能?例如,为什么不创建扩展Iterable的新接口SplitIterable?
>实施这些替代方案(扩展接口?)会有什么影响?
>如果可以将其实现为其他方法的组合,我应该在第一版接口中为方法提供默认实现?

Why was this language feature introduced?

它主要被添加,让您添加方法到已经在使用的现有接口,而不会破坏每个人的代码,而且还可以在实现相同接口的类(而不是通过继承进行“垂直”共享)之间“水平”共享方法实现.

What key new features does it support? (for instance Splititerators)

java.util.Collection的< T> .stream()

What other alternatives were there to support those language features? For example, why not create a new interface SplitIterable that extends Iterable?

您可以选择全新的界面,并继续关联的静态助手类(例如Collection&T>接口及其Collections帮助器类).这并不可怕 – 事实上,人们可以认为默认方法纯粹是一种静态方法*上的语法糖.然而,默认方法通常提供更好的可读性.

What would be the impact of implementing those alternatives (proliferation of interfaces?)

你最终会得到一个不太一致的图书馆和一个不太可读的语言,但它不会是世界的尽头.如Joachim Sauer所指出的,更大的关注是接口实现无法从静态助手类中覆盖实现.这将消除灵活性.

Should I provide a default implementation for a method in the first edition of interface when it is possible to implement it as a composition of other methods?

只有当您需要“水平”共享实现时,才应该执行此操作.如果一个方法提供实现的基本行为,不要为其提供默认值.

*这将是一个过度简化,因为默认方法仍然是虚拟的.感谢Brian Goetz的评论.

翻译自:https://stackoverflow.com/questions/36335838/why-is-adding-default-methods-to-interfaces-in-java-8-a-good-design-choice-and-w

转载注明原文:为什么在Java 8中为接口添加默认方法是一个很好的设计选择,什么是替代