Нещодавно я помітив, що в інтерфейсах є статичні методи. Як і у статичних полів інтерфейсу, є цікава поведінка: вони не передаються у спадок.
Я не впевнений, що корисне у фактичних інтерфейсах, які потрібно реалізувати. Однак це дозволяє програмісту створювати інтерфейси, які є просто конвертами для статичних матеріалів, як, наприклад, класи класів.
Простий приклад - просто конверт для глобальних констант. Порівняно з класом, ви можете легко помітити відсутню котельну табличку, 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
методи та поля. Вони не передаються у спадок, тому вони не порушують багаторазового успадкування.