Статические методы в интерфейсах
Добавлять статические вспомогательные методы непосредственно в интерфейсы вместо отдельных вспомогательных классов.
Сравнение кода
✕ Java 7
// Separate utility class needed
public class ValidatorUtils {
public static boolean isBlank(
String s) {
return s == null ||
s.trim().isEmpty();
}
}
// Usage
if (ValidatorUtils.isBlank(input)) { ... }
✓ Java 8+
public interface Validator {
boolean validate(String s);
static boolean isBlank(String s) {
return s == null ||
s.trim().isEmpty();
}
}
// Usage
if (Validator.isBlank(input)) { ... }
Заметили проблему в этом коде? Сообщите нам.
Почему современный подход лучше
Лучшая организация
Хранить связанные вспомогательные функции рядом с интерфейсом, а не в отдельном классе.
Обнаруживаемость
Фабричные и вспомогательные методы находятся там, где их ожидают.
Связность API
Больше не нужны отдельные классы *Utils или *Helper.
Старый подход
Вспомогательные классы
Современный подход
Статические методы интерфейса
Начиная с JDK
8
Сложность
Начинающий
Поддержка JDK
Статические методы в интерфейсах
Доступно
Доступно с JDK 8 (март 2014)
Как это работает
До Java 8 вспомогательные методы, относящиеся к интерфейсу, должны были находиться в отдельном классе (например, Collections для Collection). Статические методы в интерфейсах позволяют держать связанные вспомогательные функции вместе. Широко используется в современных API: Comparator.comparing(), Stream.of() и List.of().
Связанная документация
Доказательство