1
相互实现两个Java 8默认方法是否是一种好习惯?
我正在设计一个具有两个相关方法的接口,类似于此方法: 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代码的开销。