Ich habe erst kürzlich bemerkt, dass es eine Option gibt, statische Methoden in Schnittstellen zu haben. Wie bei statischen Schnittstellenfeldern gibt es ein interessantes Verhalten: Diese werden nicht vererbt.
Ich bin mir nicht sicher, ob es in den tatsächlichen Schnittstellen, die implementiert werden sollen, nützlich ist. Es ermöglicht dem Programmierer jedoch, Schnittstellen zu erstellen, die nur Hüllkurven für statische Inhalte sind, wie z. B. Utility-Klassen.
Ein einfaches Beispiel ist nur ein Umschlag für globale Konstanten. Im Vergleich zu einer Klasse können Sie das fehlende Boilerplate von leicht bemerken, public static final
da diese angenommen werden (was es weniger ausführlich macht).
public interface Constants {
String LOG_MESSAGE_FAILURE = "I took an arrow to the knee.";
int DEFAULT_TIMEOUT_MS = 30;
}
Sie könnten auch etwas komplexeres machen, wie diese Pseudo-Enumeration von Konfigurationsschlüsseln.
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;
}
}
Sie können auf diese Weise auch eine Dienstprogramm- "Klasse" erstellen. In Dienstprogrammen ist es jedoch oft nützlich, private oder geschützte Hilfsmethoden zu verwenden, was in Klassen nicht ganz möglich ist.
Ich halte es für eine nette Neuerung, und insbesondere die Tatsache, dass die statischen Member nicht vererbt werden, ist ein interessantes Konzept, das nur für Schnittstellen eingeführt wurde.
Ich frage mich, ob Sie es für eine gute Praxis halten können. Während Code-Stil und Best Practices nicht selbstverständlich sind und es Raum für Meinungen gibt, gibt es meiner Meinung nach in der Regel gültige Gründe, die die Meinung stützen.
Ich interessiere mich mehr für die Gründe (nicht), Muster wie diese beiden zu verwenden.
Beachten Sie, dass ich diese Schnittstellen nicht implementieren möchte. Sie sind lediglich ein Umschlag für ihren statischen Inhalt. Ich beabsichtige nur, die Konstanten oder Methoden zu verwenden und möglicherweise den statischen Import zu verwenden.
default
Methoden. Ich spreche über static
Methoden und Felder. Diese werden nicht vererbt, sodass sie die Mehrfachvererbung nicht aufheben.