Java 8의 가장 유용한 기능 중 하나는 default
인터페이스 의 새로운 메소드입니다. 그들이 소개 된 이유는 본질적으로 두 가지가 있습니다 (다른 것들이있을 수 있습니다).
- 실제 기본 구현 제공 예:
Iterator.remove()
- JDK API 진화를 허용합니다. 예:
Iterable.forEach()
API 디자이너의 관점에서 나는 인터페이스 메소드에 다른 수정자를 사용할 수 있기를 원했습니다 final
. 이는 편리한 메소드를 추가 할 때 유용하며 클래스 구현시 "우연한"재정의를 방지합니다.
interface Sender {
// Convenience method to send an empty message
default final void send() {
send(null);
}
// Implementations should only implement this method
void send(String message);
}
위 Sender
의 클래스 는 이미 일반적인 관행입니다 .
abstract class Sender {
// Convenience method to send an empty message
final void send() {
send(null);
}
// Implementations should only implement this method
abstract void send(String message);
}
지금 default
과는 final
분명 키워드 모순되지만, 기본 자체가 키워드 엄격하게 요구되지 않았을 나는 사이의 미묘한 차이를 반영하기 위해,이 모순은 고의적 인 있으리라 믿고있어, 그래서 "몸 클래스 메소드" (단지 방법) 및 "인터페이스를 본문이있는 메소드 " (기본 메소드), 즉 아직 이해하지 못한 차이점이 있습니다.
어떤 시점에서 Brian Goetz는 다음 static
과 같이 final
인터페이스 방법 과 같은 수정 자에 대한 지원 이 아직 완전히 탐구되지 않았습니다 .
다른 부분은 최종 메소드, 개인 메소드, 보호 된 메소드, 정적 메소드 등과 같은 인터페이스에서 클래스 작성 도구를 지원하기 위해 얼마나 멀리 갈 것인가입니다. 대답은 다음과 같습니다.
2011 년 말 이래로 static
인터페이스의 메소드에 대한 지원 이 추가되었습니다. 분명히 이것은와 같이 JDK 라이브러리 자체에 많은 가치를 부여했습니다 Comparator.comparing()
.
질문:
어떤 이유는 final
(도 static final
) 8 인터페이스를 자바로 만든 적이?
final
메소드가 재정의되는 것을 막고, 인터페이스에서 상속 된 메소드를 어떻게 재정의해야하는지 알기 때문에, 그것이 최종적인 이유가 무엇인지 알 수 없습니다. 한 번 재정의 한 후에이 방법이 최종임을 의미하지 않는 한,이 경우 어쩌면 어려움이 있습니까? 이 권리를 이해하지 못한다면, 저를 놀라게하십시오. 흥미로운 것 같습니다
final
클래스 구현이 인터페이스 메소드의 기본 구현을 대체하지 못하게하는 데 사용됩니다.