Todas las buenas respuestas aquí. Me gustaría agregar otro uso práctico de la función estática en la interfaz. La sugerencia proviene del libro - Effective Java, 3rd Edition de Joshua Bloch en el Capítulo 2: Creación y destrucción de objetos.
Static functions can be used for static factory methods.
Los métodos de fábrica estáticos son métodos que devuelven un objeto. Trabajan como constructor. En casos específicos, el método de fábrica estática proporciona un código más legible que el constructor.
Citando del libro - Effective Java, 3rd Edition por Joshua Bloch
Antes de Java 8, las interfaces no podían tener métodos estáticos. Por convención, los métodos de fábrica estáticos para una interfaz denominada Tipo se incluyeron en una clase complementaria no instantable (elemento 4) denominada Tipos.
El autor da un ejemplo de colecciones donde se implementa dicho método de fábrica estático. Verificando el código, Josh Bloch puede verse como el primer autor de la clase Colecciones. Aunque Collections es una clase y no una interfaz. Pero el concepto aún se aplica.
Por ejemplo, Java Collections Framework tiene cuarenta y cinco implementaciones de utilidades de sus interfaces, que proporcionan colecciones no modificables, colecciones sincronizadas y similares. Casi todas estas implementaciones se exportan a través de métodos de fábrica estáticos en una clase no instanciable (java.util.Collections). Las clases de los objetos devueltos no son públicas.
Además, explica que la API no solo es más pequeña, sino que ayuda con la legibilidad del código y la facilidad de la API.
No es solo la mayor parte de la API lo que se reduce, sino el peso conceptual: el número y la dificultad de los conceptos que los programadores deben dominar para utilizar la API. El programador sabe que el objeto devuelto tiene precisamente la API especificada por su interfaz, por lo que no es necesario leer documentación de clase adicional para la clase de implementación.
Aquí está uno de los métodos estáticos de la clase java.util.Collections:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}