这篇Java教程基于JDK1.8。教程中的示例和实践不会使用未来发行版中的优化建议。
接口进化
假设你开发了一个叫做DoIt的接口:
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
}
假设过了一段时间,你想在DoIt中添加一个新方法,接口将变成
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
boolean didItWork(int i, double x, String s);
}
如果进行这样的更改,则实现旧DoIt接口的所有类都将中断,因为它们不再实现旧接口。依赖这个接口的程序员会大声抗议。
尝试从一开始就预料到接口的所有用途,并完全指定它。如果你想在接口中添加方法,有几种办法。可以创建一个DoItPlus 接口继承自Dolt。
public interface DoItPlus extends DoIt {
boolean didItWork(int i, double x, String s);
}
这样由用户来选择是继续使用旧接口还是升级到新接口。
同时,你也可以把新方法定义为默认方法,下面的示例定义了一个默认方法didItWork:
public interface DoIt {
void doSomething(int i, double x);
int doSomethingElse(String s);
default boolean didItWork(int i, double x, String s) {
// Method body
}
}
注意你必须为默认方法提供一个实现。你也可以在现有接口定义新的静态方法。对于那些使用新的默认方法或静态方法增强接口的类用户而言,不必修改或重新编译它们来适应添加的方法。