Все хорошие ответы здесь. Я хотел бы добавить еще одно практическое использование статической функции в интерфейсе. Совет взят из книги Джошуа Блоха «Эффективная Java, 3-е издание» в главе 2: Создание и уничтожение объекта.
Static functions can be used for static factory methods.
Статический фабричный метод - это методы, возвращающие объект. Они работают как конструктор. В определенных случаях статический фабричный метод предоставляет более читаемый код, чем использование конструктора.
Цитата из книги - Эффективная Java, 3-е издание, Джошуа Блох
До Java 8 интерфейсы не могли иметь статических методов. По соглашению статические фабричные методы для интерфейса с именем Type были помещены в несуществующий сопутствующий класс (элемент 4) с именем Types.
Автор приводит пример Коллекций, в которых реализован такой статический фабричный метод. Проверяя код, можно увидеть Джоша Блоха как первого автора класса Collections. Хотя Коллекции - это класс, а не интерфейс. Но концепция все еще актуальна.
Например, Java Collections Framework имеет сорок пять служебных реализаций своих интерфейсов, обеспечивающих неизменяемые коллекции, синхронизированные коллекции и т.п. Почти все эти реализации экспортируются через статические фабричные методы в один неинстанцируемый класс (java.util.Collections). Все классы возвращаемых объектов не являются общедоступными.
Далее он объясняет, что API не только меньше, он помогает с читабельностью кода и легкостью API.
Уменьшается не только основная часть API, но и концептуальный вес: количество и сложность концепций, которые программисты должны освоить, чтобы использовать API. Программист знает, что возвращаемый объект имеет именно тот API, который указан в его интерфейсе, поэтому нет необходимости читать дополнительную документацию по классу для класса реализации.
Вот один из статических методов из класса java.util.Collections:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}