Ho appena notato che esiste un'opzione per avere metodi statici nelle interfacce. Come per i campi statici di interfaccia, c'è un comportamento interessante: questi non sono ereditati.
Non sono sicuro che sia utile nelle interfacce reali che devono essere implementate. Tuttavia, consente al programmatore di creare interfacce che sono solo buste per roba statica, come ad esempio le classi di utilità.
Un semplice esempio è solo una busta per le costanti globali. Rispetto a una classe, puoi facilmente notare la piastra di caldaia mancante di public static final
come si presume (rendendola meno dettagliata).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Potresti anche rendere qualcosa di più complesso, come questo pseudo-enum di tasti di configurazione.
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;
}
}
In questo modo è anche possibile creare alcune "classi" di utilità. Tuttavia, nelle utility, è spesso utile utilizzare metodi di supporto privati o protetti, che non è del tutto possibile nelle classi.
La considero una bella nuova funzionalità, e soprattutto il fatto che i membri statici non siano ereditati è un concetto interessante che è stato introdotto solo per le interfacce.
Mi chiedo se puoi considerarlo una buona pratica. Mentre lo stile del codice e le migliori pratiche non sono assiomatici e c'è spazio per l'opinione, penso che di solito ci siano ragioni valide a sostegno dell'opinione.
Sono più interessato ai motivi (non) per usare modelli come questi due.
Nota che non intendo implementare quelle interfacce. Sono semplicemente una busta per il loro contenuto statico. Intendo solo usare le costanti o i metodi e possibilmente usare l'importazione statica.
default
metodi. Sto parlando di static
metodi e campi. Quelli non sono ereditati, quindi non rompono l'eredità multipla.