Я только недавно заметил, что есть возможность иметь статические методы в интерфейсах. Как и в случае статических полей интерфейса, есть интересное поведение: они не наследуются.
Я не уверен, что это полезно в реальных интерфейсах, которые должны быть реализованы. Тем не менее, он позволяет программисту создавать интерфейсы, которые являются просто оболочками для статических вещей, как, например, служебные классы.
Простой пример - просто конверт для глобальных констант. По сравнению с классом, вы можете легко заметить отсутствующий шаблон 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;
}
}
Вы также можете создать некоторую утилиту "класс" таким образом. Однако в утилитах часто полезно использовать закрытые или защищенные вспомогательные методы, что не совсем возможно в классах.
Я считаю, что это хорошая новая функция, и особенно тот факт, что статические члены не наследуются, является интересной концепцией, которая была представлена только для интерфейсов.
Интересно, можете ли вы считать это хорошей практикой? Хотя стиль кода и лучшие практики не являются аксиоматичными и есть место для мнений, я думаю, что обычно существуют веские причины, поддерживающие мнение.
Меня больше интересуют причины (не) использовать шаблоны, подобные этим двум.
Обратите внимание, что я не собираюсь реализовывать эти интерфейсы. Они просто конверт для их статического содержания. Я только намерен использовать константы или методы и, возможно, использовать статический импорт.
default
методах. Я говорю о static
методах и областях. Они не наследуются, поэтому они не нарушают множественное наследование.