짧은 대답은 : 안전하게 사용하면 안전합니다. :)
은밀한 대답 : 특성 이 의미하는 바를 알려 주시면 더 나은 대답을 드리겠습니다. :)
진지하게 "특성"이라는 용어는 잘 정의되어 있지 않습니다. 많은 Java 개발자가 스칼라로 표현되는 특성에 가장 익숙하지만 스칼라는 이름이나 효과가있는 특성을 가진 첫 번째 언어와는 거리가 멀다.
예를 들어, Scala에서 특성은 상태 저장 ( var
변수 를 가질 수 있음 )입니다. Fortress에서는 순수한 행동입니다. 기본 메소드가있는 Java의 인터페이스는 상태 비 저장입니다. 이것은 그들이 특성이 아니라는 것을 의미합니까? (힌트 : 그것은 속임수 질문이었습니다.)
다시, Scala에서 형질은 선형화를 통해 구성됩니다. 클래스는 경우 A
특성 확장 X
하고 Y
,있는 다음 순서 X
와는 Y
갈등 방법이 결정에 혼합 X
하고이 Y
해결됩니다. 자바에서는 이러한 선형화 메커니즘이 존재하지 않습니다 (부분적으로 너무 "Java와 유사하지 않기 때문에"거부되었습니다.)
인터페이스에 기본 메소드를 추가하는 가장 가까운 이유는 인터페이스 진화 를 지원하기위한 것이었지만, 우리는 그 이상으로 나아가고 있다는 것을 잘 알고있었습니다. 그것이 "인터페이스 진화 ++"인지 "특성-"인지 여부는 개인적인 해석의 문제입니다. 따라서 안전에 대한 질문에 대답하려면 ... 메커니즘이 실제로 지원하는 것에 충실하는 한, 지원하지 않는 부분에 원하는대로 늘리려 고 시도하는 것이 아니라 괜찮습니다.
주요 디자인 목표는 인터페이스 의 클라이언트 관점 에서 기본 메서드가 "일반"인터페이스 메서드와 구분할 수 없어야한다는 것입니다. 따라서 메서드의 기본값 은 인터페이스 의 설계자 및 구현 자 에게만 흥미 롭습니다 .
다음은 디자인 목표에 적합한 몇 가지 사용 사례입니다.
인터페이스 진화. 여기에서는 기존 인터페이스에 새 메소드를 추가합니다.이 인터페이스에는 해당 인터페이스의 기존 메소드 측면에서 합리적인 기본 구현이 있습니다. 예를 들어에 forEach
메서드를 추가하는 Collection
경우 기본 구현이 iterator()
메서드 측면에서 작성됩니다 .
"선택적"방법. 여기에서 인터페이스 설계자는 "수반되는 기능의 한계를 감수 할 의사가 있다면 구현자가이 방법을 구현할 필요가 없습니다"라고 말합니다. 예를 들어, Iterator.remove
다음을 던지는 기본값이 주어졌습니다 UnsupportedOperationException
. 대부분의 구현은 Iterator
어쨌든이 동작 을 가지고 있기 때문에 기본값은이 메서드를 본질적으로 선택적으로 만듭니다. (의 동작이에서 AbstractCollection
기본값으로 표현 된 Collection
경우 돌연변이 메서드에 대해 동일한 작업을 수행 할 수 있습니다.)
편리한 방법. 이것들은 엄격히 편의를위한 메서드이며, 일반적으로 클래스의 기본값이 아닌 메서드 측면에서 구현됩니다. logger()
첫 번째 예에서 방법이 합리적인 그림입니다.
결합 자. 현재 인스턴스를 기반으로 인터페이스의 새 인스턴스를 인스턴스화하는 구성 메서드입니다. 예를 들어, 방법 Predicate.and()
또는 Comparator.thenComparing()
결합 자의 예입니다.
기본 구현을 제공하는 경우 @implSpec
구현자가 메서드를 재정의할지 여부를 이해하는 데 도움이 되도록 기본값 (JDK에서는 javadoc 태그를 사용)에 대한 일부 사양도 제공해야 합니다. 편의 메서드 및 결합 자와 같은 일부 기본값은 거의 무시되지 않습니다. 선택적 메서드와 같은 다른 것들은 종종 재정의됩니다. 기본이 무엇을 약속하는지에 대한 충분한 사양 (문서뿐만 아니라)을 제공해야 구현자가이를 재정의해야하는지 여부에 대해 현명한 결정을 내릴 수 있습니다.