최근에 인터페이스에 정적 메소드를 갖는 옵션이 있음을 알았습니다. 정적 인터페이스 필드와 마찬가지로 흥미로운 동작이 있습니다. 상속되지 않습니다.
구현할 실제 인터페이스에서 유용하다는 확신이 없습니다. 그러나 프로그래머는 유틸리티 클래스와 같이 정적 요소를위한 엔벨로프 인 인터페이스를 작성할 수 있습니다.
간단한 예는 전역 상수를위한 봉투입니다. 클래스와 비교할 때 누락 된 보일러 플레이트를 쉽게 알아볼 수 있습니다 public static final
.
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
이 가상 키 구성 키와 같이 더 복잡한 것을 만들 수도 있습니다.
public interface ConfigKeys {
static createValues(ConfigKey<?>... values) {
return Collections.unmodifiableSet(new HashSet(Arrays.asList(values)));
}
static ConfigKey<T> key(Class<T> clazz) {
return new ConfigKey<>(clazz);
}
class ConfigKey<T> {
private final Class<T> type;
private ConfigKey(Class<T> type) {
this.type = type;
}
private Class<T> getType() {
return type;
}
}
}
import static ConfigKeys.*;
public interface MyAppConfigKeys {
ConfigKey<Boolean> TEST_MODE = key(Boolean.class);
ConfigKey<String> COMPANY_NAME = key(String.class);
Set<ConfigKey<?>> VALUES = createValues(TEST_MODE, COMPANY_VALUE);
static values() {
return VALUES;
}
}
이런 식으로 유틸리티 "클래스"를 만들 수도 있습니다. 그러나 유틸리티에서는 개인 또는 보호 된 헬퍼 메소드를 사용하는 것이 유용하지만 클래스에서는 불가능합니다.
나는 이것이 새로운 기능이라고 생각합니다. 특히 정적 멤버가 상속되지 않았다는 사실은 인터페이스에만 소개 된 흥미로운 개념입니다.
좋은 습관으로 생각할 수 있는지 궁금합니다. 코드 스타일과 모범 사례는 공리적이지 않으며 의견의 여지가 있지만 일반적으로 의견을 뒷받침하는 정당한 이유가 있다고 생각합니다.
나는이 두 가지와 같은 패턴을 사용하는 이유에 더 관심이 있습니다.
해당 인터페이스를 구현하지는 않습니다. 정적 콘텐츠를위한 봉투 일뿐입니다. 상수 또는 메소드 만 사용하고 정적 가져 오기를 사용하려고합니다.
default
방법 에 대해 이야기하고 있습니다. 나는 static
방법과 분야 에 대해 이야기 하고 있습니다. 그것들은 상속되지 않으므로 다중 상속을 중단하지 않습니다.