Tutte buone risposte qui. Vorrei aggiungere un altro utilizzo pratico della funzione statica nell'interfaccia. Il suggerimento viene dal libro - Effective Java, 3a edizione di Joshua Bloch nel Capitolo 2: Creazione e distruzione di oggetti.
Static functions can be used for static factory methods.
I metodi factory statici sono metodi che restituiscono un oggetto. Funzionano come costruttori. In casi specifici, il metodo factory statico fornisce un codice più leggibile rispetto all'utilizzo del costruttore.
Citando dal libro - Effective Java, 3a edizione di Joshua Bloch
Prima di Java 8, le interfacce non potevano avere metodi statici. Per convenzione, i metodi factory statici per un'interfaccia denominata Type sono stati inseriti in una classe companion non istanziabile (elemento 4) denominata Types.
L'autore fornisce un esempio di collezioni in cui è implementato tale metodo factory statico. Controllando il codice, Josh Bloch può essere visto come il primo autore della classe Collections. Sebbene Collections sia una classe e non un'interfaccia. Ma il concetto è ancora valido.
Ad esempio, il Java Collections Framework ha quarantacinque implementazioni di utilità delle sue interfacce, fornendo raccolte non modificabili, raccolte sincronizzate e simili. Quasi tutte queste implementazioni vengono esportate tramite metodi factory statici in una classe non istanziabile (java.util.Collections). Le classi degli oggetti restituiti sono tutte non pubbliche.
Inoltre, spiega che l'API non è solo più piccola, aiuta con la leggibilità del codice e la facilità dell'API.
Non viene ridotto solo il grosso dell'API, ma il peso concettuale: il numero e la difficoltà dei concetti che i programmatori devono padroneggiare per utilizzare l'API. Il programmatore sa che l'oggetto restituito ha esattamente l'API specificata dalla sua interfaccia, quindi non è necessario leggere la documentazione aggiuntiva della classe per la classe di implementazione.
Ecco uno dei metodi statici della classe java.util.Collections:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}