【发布时间】:2020-08-19 07:27:43
【问题描述】:
想象一下我有一个如下界面:
public interface DataChecker<T, C> {
default ProcessResult beforeProcess(T record, CountertHelper countertHelper, C config){
return new ProcessResult(false, Collections.emptyList());
}
default List<String> checkData(T record, CountertHelper countertHelper, C config) {
return Collections.emptyList();
}
@RequiredArgsConstructor
@Getter
class ProcessResult {
private final boolean skip;
private final List<String> keys;
public ProcessResult(boolean skip) {
this.skip = skip;
this.keys = Collections.emptyList();
}
}
}
此接口的一些实现者可能只实现beforProcess 方法,而另一些可能只实现checkData 方法,而其他一些实现者可能选择同时实现这两种方法。
将它们都设为default 是一个好习惯吗?或者更一般地说,拥有一个对所有方法都有default 实现的接口是一个好习惯。
【问题讨论】:
-
为什么不将你的接口拆分为 2 个不同的接口,每个接口都有一个方法,根据使用情况,该类可以实现任何一个或两个。
-
在我看来(因为它是我的意见,我投票关闭它)只是因为你可以在新接口中添加默认方法,并不意味着你应该。这意味着他们可以将方法添加到旧接口而不会导致应用程序到处崩溃,因为向后兼容,而不是你可以将它放在新接口中
-
我认为这违背了界面目的。当您要确保对象上存在几个函数(接口)并且添加行为和功能在类范围内时,通常会使用接口。正如@Stultuske 提到的,添加了默认方法是为了向后兼容。默认实现可以在实现接口的单独默认开放类中定义。
-
您总是可以定义一个接口,然后定义一个默认实现(在 AWT/Swing 中,一个“适配器”)。或者直接定义超类而不定义接口(这更接近你想要做的)。默认方法是一种在不破坏兼容性的情况下解决修改现有接口问题的方法,它们并不意味着改变接口的使用。