Ho appena notato che esiste un'opzione per avere metodi statici nelle interfacce. Come con i campi di interfaccia statici, esiste un comportamento interessante: questi non sono ereditati.
Non sono sicuro che sia utile nelle effettive interfacce che devono essere implementate. Tuttavia, consente al programmatore di creare interfacce che sono solo buste per materiale statico, come ad es. le classi di utilità sono.
Un semplice esempio è solo una busta per le costanti globali. Rispetto ad una classe, puoi facilmente notare la piastra mancante di public static final
come si suppone (rendendola meno dettagliata).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Potresti anche creare qualcosa di più complesso, come questo pseudo-enum di chiavi 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 potresti anche creare qualche "classe" di utilità. Tuttavia, nelle utility, è spesso utile utilizzare metodi di helper privati o protetti, il che non è del tutto possibile nelle classi.
Lo 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 assiomatiche e c'è spazio per un'opinione, penso che di solito ci siano validi motivi per sostenere l'opinione.
Sono più interessato ai motivi (non) di utilizzare modelli come questi.
Si noti che non intendo implementare tali interfacce. Sono semplicemente una busta per il loro contenuto statico. Intendo solo utilizzare le costanti o i metodi e possibilmente usare l'importazione statica.