私はこれに似た2つの関連する方法でインターフェースを設計しています:
public interface ThingComputer {
default Thing computeFirstThing() {
return computeAllThings().get(0);
}
default List<Thing> computeAllThings() {
return ImmutableList.of(computeFirstThing());
}
}
実装の約半分で計算されるのは1つだけですが、残りの半分ではさらに多くの計算が行われます。
これは、広く使用されているJava 8コードに先例がありますか?Haskellがいくつかのタイプクラスで同様のことを行うことは知っています(Eq
たとえば)。
利点は、2つの抽象クラス(SingleThingComputer
およびMultipleThingComputer
)を使用した場合よりも大幅に少ないコードを記述する必要があることです。
欠点は、空の実装がコンパイルされますが、実行時にStackOverflowError
。を使用して相互再帰を検出しThreadLocal
、より良いエラーを与えることは可能ですが、それにより、バグのないコードにオーバーヘッドが追加されます。
throw new Error();
たり、バカなことを強制できると言っているわけではないことに注意してください。インターフェイス自体にdefault
メソッドを介した脆弱なコントラクトがないようにしてください。
abstract
を強制するために存在します。