Niedawno zauważyłem, że istnieje możliwość posiadania statycznych metod w interfejsach. Podobnie jak w przypadku statycznych pól interfejsu, istnieje ciekawe zachowanie: nie są one dziedziczone.
Nie jestem pewien, czy jest to przydatne w rzeczywistych interfejsach, które mają zostać zaimplementowane. Umożliwia to jednak programistom tworzenie interfejsów, które są po prostu kopertami dla elementów statycznych, takich jak np. Klasy narzędzi.
Prostym przykładem jest po prostu koperta dla globalnych stałych. W porównaniu z klasą można łatwo zauważyć brakującą płytkę kotłową, public static final
ponieważ są one zakładane (co czyni ją mniej gadatliwą).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Możesz także zrobić coś bardziej złożonego, na przykład ten pseudo-wyliczenie kluczy konfiguracji.
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;
}
}
W ten sposób można również utworzyć „klasę” narzędzi. Jednak w narzędziach często przydatne jest stosowanie prywatnych lub chronionych metod pomocniczych, co nie jest całkiem możliwe w klasach.
Uważam, że jest to miła nowa funkcja, a zwłaszcza fakt, że elementy statyczne nie są dziedziczone, jest interesującą koncepcją, która została wprowadzona tylko do interfejsów.
Zastanawiam się, czy możesz uznać to za dobrą praktykę. Podczas gdy styl kodu i najlepsze praktyki nie są aksjomatyczne i jest miejsce na opinię, myślę, że zwykle istnieją uzasadnione powody, aby poprzeć opinię.
Bardziej interesują mnie powody (nie) używania takich wzorców.
Zauważ, że nie zamierzam implementować tych interfejsów. Są jedynie kopertą ze względu na ich statyczną zawartość. Zamierzam użyć tylko stałych lub metod i ewentualnie użyć importu statycznego.
default
metodach. Mówię o static
metodach i polach. Nie są one dziedziczone, więc nie przerywają wielokrotnego dziedziczenia.