다음과 비슷한 두 가지 관련 방법으로 인터페이스를 설계하고 있습니다.
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
더 좋은 오류를 줄 수는 있지만 버그가없는 코드에 오버 헤드가 추가됩니다.
throw new Error();
하거나 어리석은 것을 강요 할 수 있거나 강요해야한다고 말하지 는 않으며 인터페이스 자체 가 default
메소드를 통해 취성 계약을 맺지 않아야 합니다.
abstract
할 수있는 강제 를 해결하도록.