특성으로 Java 8 기본 메소드 : 안전?
Java 8에서 기본 메소드를 가난한 사람의 특성 버전으로 사용하는 것이 안전한 방법 입니까?
어떤 사람들은 팬더를 위해서만 사용하면 팬더가 슬프게 만들 수 있다고 주장합니다. 시원하기 때문입니다. 그러나 그것은 제 의도가 아닙니다. 또한 API 진화 및 이전 버전과의 호환성을 지원하기 위해 기본 메소드가 도입되었다는 사실을 종종 상기하지만, 이것이 그 자체를 특성으로 사용하는 것이 잘못되거나 뒤 틀리지는 않습니다.
나는이 다음과 같은 실제 사용 사례 를 염두에를 :
public interface Loggable {
default Logger logger() {
return LoggerFactory.getLogger(this.getClass());
}
}
또는 다음을 정의하십시오 PeriodTrait.
public interface PeriodeTrait {
Date getStartDate();
Date getEndDate();
default isValid(Date atDate) {
...
}
}
당연히, 작곡이 사용될 수 있지만 (또는 도우미 클래스) 더 장황하고 어수선 해 보이며 다형성으로부터 이익을 얻지 못합니다.
그래서 기본 방법을 기본 특성으로 사용하는 것이 좋거나 안전 합니까, 또는 예기치 않은 부작용에 대해 걱정해야합니까?
SO에 대한 몇 가지 질문 은 Java vs Scala 특성과 관련이 있습니다. 그것은 요점이 아닙니다. 나는 단지 의견을 요구하는 것이 아닙니다. 대신, 저는 권위있는 답변이나 최소한의 현장 통찰력을 찾고 있습니다. 기업 프로젝트에서 기본 방법을 특성으로 사용했다면 시한 폭탄이 되었습니까?
짧은 대답은 : 안전하게 사용하면 안전합니다 :)
으스스한 답변 : 당신 이 특성의 의미를 말해 주시면 더 나은 대답을 드릴 것입니다 :)
진지하게, "특성"이라는 용어는 잘 정의되어 있지 않습니다. 많은 자바 개발자들은 스칼라로 표현되는 특성에 가장 친숙하지만, 스칼라는 이름이나 효과가있는 첫 번째 언어와는 거리가 멀다.
예를 들어, 스칼라에서 특성은 상태 저장 ( var변수 를 가질 수 있음 )입니다. 요새에서 그들은 순수한 행동입니다. 기본 메소드가있는 Java 인터페이스는 상태 비 저장입니다. 이것이 특성이 아님을 의미합니까? (힌트 : 그게 까다로운 질문이었습니다.)
다시 스칼라에서는 특성이 선형화를 통해 구성됩니다. 클래스는 경우 A특성 확장 X하고 Y,있는 다음 순서 X와는 Y갈등 방법이 결정에 혼합 X하고이 Y해결됩니다. Java에서는이 선형화 메커니즘이 존재하지 않습니다 (일부 "Java와 유사하지 않기 때문에 거부되었습니다").
인터페이스에 기본 메소드를 추가하는 가장 가까운 이유는 인터페이스 진화 를 지원하는 것이었지만, 우리는 그 이상을 넘어선다는 것을 잘 알고있었습니다. "인터페이스 에볼루션 ++"또는 "특성"이라고 생각하는지 여부는 개인적인 해석의 문제입니다. 따라서 안전에 대한 질문에 대답하려면 ... 메커니즘이 실제로 지원하는 것을 고수하지 않고 지원하지 않는 것으로 늘리려는 것이 아니라면 괜찮습니다.
핵심 설계 목표는 인터페이스 클라이언트 의 관점 에서 기본 메소드를 "일반"인터페이스 메소드와 구별 할 수 없어야 한다는 것이었다 . 따라서 메소드의 기본값 은 인터페이스 의 설계자 및 구현 자 에게만 흥미 롭습니다 .
다음은 디자인 목표에 맞는 사용 사례입니다.
인터페이스 진화. 여기서는 기존 인터페이스에 새 메소드를 추가하고 있는데,이 인터페이스는 기존 인터페이스의 기존 메소드 측면에서 합리적인 기본 구현을 갖습니다. 예를 들어 기본 구현이 메소드 측면에서 작성된
forEach메소드를에 추가하는 것 입니다.Collectioniterator()"선택적"방법. 여기서 인터페이스 디자이너는 "수행자가 기능에 한계가있을 경우이 방법을 구현할 필요가 없다"고 말합니다. 예를 들어,
Iterator.remove기본값은UnsupportedOperationException;Iterator어쨌든 구현의 대다수는 어쨌든이 동작 을 갖기 때문에 기본적 으로이 방법은 본질적으로 선택 사항입니다. 의 동작AbstractCollection이 기본값으로 표현 된Collection경우 돌연변이 방식에 대해서도 동일하게 수행 할 수 있습니다.편의 방법. 이것들은 편의상 엄격하게 클래스가 아닌 기본 메소드로 다시 구현되는 메소드입니다.
logger()첫 번째 예에서 방법이 합리적인 그림입니다.조합기. 이들은 현재 인스턴스를 기반으로 인터페이스의 새 인스턴스를 인스턴스화하는 구성 방법입니다. 예를 들어, 방법
Predicate.and()또는Comparator.thenComparing()조합기의 예이다.
기본 구현을 제공하는 경우 @implSpec구현자가 메소드를 대체할지 여부를 이해하는 데 도움이 되도록 기본에 대한 일부 스펙도 제공해야합니다 (JDK에서는이를 위해 javadoc 태그를 사용함 ). 편의 방법 및 결합기와 같은 일부 기본값은 거의 무시되지 않습니다. 선택적 방법과 같은 다른 방법은 종종 재정의됩니다. 기본 약속에 대한 충분한 사양 (문서뿐만 아니라)을 제공해야합니다. 따라서 구현자가이를 재정의해야하는지에 대한 합리적인 결정을 내릴 수 있습니다.
참고 URL : https://stackoverflow.com/questions/28681737/java-8-default-methods-as-traits-safe
'Programing' 카테고리의 다른 글
| Facebook React에서 코드 재사용을 위해 믹스 인과 컴포넌트 사용 (0) | 2020.07.22 |
|---|---|
| 무엇을합니까. (0) | 2020.07.22 |
| .NET : 필요한 구성 설정이 누락되면 어떤 예외가 발생합니까? (0) | 2020.07.22 |
| SSH 키를 제거하는 방법? (0) | 2020.07.22 |
| R 프로세스가 사용할 수있는 메모리를 늘리거나 줄입니다. (0) | 2020.07.22 |