最近、インターフェイスに静的メソッドを持つオプションがあることに気付きました。インターフェイスの静的フィールドと同様に、興味深い動作があります。これらは継承されません。
実装される実際のインターフェースで有用かどうかはわかりません。ただし、プログラマは、ユーティリティクラスなどの静的なものの単なるエンベロープであるインターフェイスを作成できます。
簡単な例は、グローバル定数の単なるエンベロープです。クラスと比較して、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;
}
}
この方法でユーティリティの「クラス」を作成することもできます。ただし、ユーティリティでは、プライベートヘルパーメソッドまたは保護されたヘルパーメソッドを使用すると便利な場合がよくありますが、これはクラスでは不可能です。
私はそれを素晴らしい新機能だと考えています。特に、静的メンバーが継承されないという事実は、インターフェースのみに導入された興味深い概念です。
あなたはそれを良い習慣とみなすことができるのだろうか。コードスタイルとベストプラクティスは公理的ではなく、意見の余地はありますが、意見を裏付ける正当な理由は通常あると思います。
この2つのようなパターンを使用する(しない)理由にもっと興味があります。
これらのインターフェイスを実装するつもりはないことに注意してください。それらは、静的コンテンツの単なるエンベロープです。定数またはメソッドのみを使用し、場合によっては静的インポートを使用するつもりです。
default
方法について話している。私はstatic
メソッドとフィールドについて話している。これらは継承されないため、多重継承を壊しません。