我正在设计一个具有两个相关方法的接口,类似于此方法:
public interface ThingComputer {
default Thing computeFirstThing() {
return computeAllThings().get(0);
}
default List<Thing> computeAllThings() {
return ImmutableList.of(computeFirstThing());
}
}
大约一半的实现只会计算一件事,而另一半可能会计算更多。
这在广泛使用的Java 8代码中是否有先例?我知道Haskell在某些类型类中做类似的事情(Eq
例如)。
好处是,与拥有两个抽象类(SingleThingComputer
和MultipleThingComputer
)相比,我必须编写更少的代码。
不利的一面是,一个空的实现可以编译,但是在运行时会用炸掉StackOverflowError
。可以使用a来检测相互递归ThreadLocal
并给出更好的错误,但这会增加非Buggy代码的开销。
throw new Error();
或者做一些愚蠢的事情,只是说接口本身不应该通过default
方法具有脆弱的契约。
abstract
并强迫他们解决问题。