Приватные методы интерфейса
Выносить общую логику в интерфейсах в приватные методы.
Сравнение кода
✕ Java 8
interface Logger {
default void logInfo(String msg) {
System.out.println(
"[INFO] " + timestamp() + msg);
}
default void logWarn(String msg) {
System.out.println(
"[WARN] " + timestamp() + msg);
}
}
✓ Java 9+
interface Logger {
private String format(String lvl, String msg) {
return "[" + lvl + "] " + timestamp() + msg;
}
default void logInfo(String msg) {
IO.println(format("INFO", msg));
}
default void logWarn(String msg) {
IO.println(format("WARN", msg));
}
}
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Повторное использование кода
Совместно использовать логику между методами по умолчанию без дублирования.
Инкапсуляция
Детали реализации остаются скрытыми от классов-реализаторов.
DRY-интерфейсы
Больше никакого копирования и вставки между методами по умолчанию.
Старый подход
Дублированная логика
Современный подход
Приватные методы
Начиная с JDK
9
Сложность
Средний
Поддержка JDK
Приватные методы интерфейса
Доступно
Доступно в JDK 9 (сент. 2017)
Как это работает
Java 9 позволяет использовать приватные методы в интерфейсах, что даёт возможность совместно использовать код между методами по умолчанию без раскрытия деталей реализации классам-реализаторам.
Связанная документация
Доказательство