在java 8中使用"default"修饰符的最佳方案是什么?

Nai*_*ili 3 java java-8

在新的Java 8规范语言中.他们引入了默认修饰符,允许在接口中定义方法.

我的问题是,有没有人知道这个功能的最佳用例是什么?

ass*_*ias 6

避免破坏代码 - 支持API演变

典型的例子是它在Java 8中引入方法的Iterable接口中的使用default stream().这样,所有Iterables都stream自动地继承了已经被强制化的方法.这为API演变提供了支持,而不会破坏已有的代码.

定义合理的默认行为

假设您创建了一个新的Collection框架,定义它可能是合理的:

interface MyCollection {
    int size();
    default boolean isEmpty() { return size() == 0; }
}
Run Code Online (Sandbox Code Playgroud)

通过这样做,您可以避免isEmpty在所有实现类中重新定义完全相同的方式的痛苦,同时允许特定类在需要时以不同方式实现它.

这可以在抽象类中完成,但这使您可以删除层次结构中的一个层,并获得接口的继承灵活性:类可以继承多个接口,但只能继承一个抽象类.

另请参见:使用默认方法的接口与Java 8中的Abstract类.