Wszystkie dobre odpowiedzi tutaj. Chciałbym dodać jeszcze jedno praktyczne zastosowanie funkcji statycznej w interfejsie. Wskazówka pochodzi z książki - Effective Java, 3rd Edition autorstwa Joshua Bloch w rozdziale 2: Creating and Destroying Object.
Static functions can be used for static factory methods.
Statyczne metody fabryczne to metody zwracające obiekt. Pracują jak konstruktor. W określonych przypadkach statyczna metoda fabryki zapewnia bardziej czytelny kod niż użycie konstruktora.
Cytat z książki - Effective Java, 3rd Edition autorstwa Joshua Bloch
Przed wersją Java 8 interfejsy nie mogły mieć metod statycznych. Zgodnie z konwencją statyczne metody fabryczne dla interfejsu o nazwie Type zostały umieszczone w nieinstanowalnej klasie towarzyszącej (pozycja 4) o nazwie Types.
Autor podaje przykład kolekcji, w których zaimplementowano taką statyczną metodę fabryczną. Sprawdzając kod, Josh Bloch może być postrzegany jako pierwszy autor klasy Kolekcje. Chociaż Kolekcje to klasa, a nie interfejs. Ale koncepcja nadal obowiązuje.
Na przykład Java Collections Framework ma czterdzieści pięć implementacji narzędziowych swoich interfejsów, zapewniając niezmodyfikowalne kolekcje, zsynchronizowane kolekcje i tym podobne. Prawie wszystkie te implementacje są eksportowane za pomocą statycznych metod fabrycznych w jednej nieinstanowalnej klasie (java.util.Collections). Wszystkie klasy zwróconych obiektów są niepubliczne.
Dalej wyjaśnia, że API jest nie tylko mniejsze, ale także pomaga w czytelności kodu i łatwości API.
Zmniejsza się nie tylko większość API, ale także ciężar pojęciowy: liczba i stopień trudności koncepcji, które programiści muszą opanować, aby móc korzystać z API. Programista wie, że zwracany obiekt ma dokładnie API określone przez jego interfejs, więc nie ma potrzeby czytać dodatkowej dokumentacji klasy dla klasy implementacji.
Oto jedna z metod statycznych z klasy java.util.Collections:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}