Alle guten Antworten hier. Ich möchte eine weitere praktische Verwendung der statischen Funktion in der Schnittstelle hinzufügen. Der Tipp stammt aus dem Buch - Effective Java, 3. Auflage von Joshua Bloch in Kapitel 2: Erstellen und Zerstören von Objekten.
Static functions can be used for static factory methods.
Statische Factory-Methoden sind Methoden, die ein Objekt zurückgeben. Sie arbeiten wie Konstrukteure. In bestimmten Fällen bietet die statische Factory-Methode besser lesbaren Code als die Verwendung des Konstruktors.
Zitat aus dem Buch - Effective Java, 3. Auflage von Joshua Bloch
Vor Java 8 konnten Schnittstellen keine statischen Methoden haben. Konventionell wurden statische Factory-Methoden für eine Schnittstelle mit dem Namen Type in eine nicht instabilisierbare Begleitklasse (Element 4) mit dem Namen Types gestellt.
Der Autor gibt ein Beispiel für Sammlungen, in denen eine solche statische Factory-Methode implementiert ist. Josh Bloch, der den Code überprüft, kann als Erstautor der Collections-Klasse angesehen werden. Obwohl Sammlungen eine Klasse und keine Schnittstelle ist. Das Konzept gilt jedoch weiterhin.
Beispielsweise verfügt das Java Collections Framework über 45 Dienstprogrammimplementierungen seiner Schnittstellen, die nicht modifizierbare Sammlungen, synchronisierte Sammlungen und dergleichen bereitstellen. Fast alle dieser Implementierungen werden über statische Factory-Methoden in einer nicht instabilisierbaren Klasse (java.util.Collections) exportiert. Die Klassen der zurückgegebenen Objekte sind alle nicht öffentlich.
Weiter erklärt er, dass API nicht nur kleiner ist, sondern auch die Lesbarkeit des Codes und die API erleichtert.
Es wird nicht nur der Großteil der API reduziert, sondern auch das konzeptionelle Gewicht: die Anzahl und Schwierigkeit der Konzepte, die Programmierer beherrschen müssen, um die API verwenden zu können. Der Programmierer weiß, dass das zurückgegebene Objekt genau die von seiner Schnittstelle angegebene API hat, sodass keine zusätzliche Klassendokumentation für die Implementierungsklasse gelesen werden muss.
Hier ist eine der statischen Methoden aus der Klasse java.util.Collections:
public static <T> Collection<T> unmodifiableCollection(Collection<? extends T> c) {
return new UnmodifiableCollection<>(c);
}