In Java 8 können Schnittstellen implementierte Methoden, statische Methoden und sogenannte "Standard" -Methoden enthalten (die von den implementierenden Klassen nicht überschrieben werden müssen).
Aus meiner (wahrscheinlich naiven) Sicht bestand keine Notwendigkeit, solche Schnittstellen zu verletzen. Schnittstellen waren schon immer ein Vertrag, den Sie erfüllen müssen, und dies ist ein sehr einfaches und reines Konzept. Jetzt ist es eine Mischung aus mehreren Dingen. Meiner Meinung nach:
- statische Methoden gehören nicht zu Schnittstellen. Sie gehören zu den Gebrauchsklassen.
- "Standard" -Methoden sollten in Interfaces überhaupt nicht erlaubt sein. Zu diesem Zweck können Sie immer eine abstrakte Klasse verwenden.
Zusamenfassend:
Vor Java 8:
- Sie können abstrakte und reguläre Klassen verwenden, um statische und Standardmethoden bereitzustellen. Die Rolle der Schnittstellen ist klar.
- Alle Methoden in einer Schnittstelle sollten durch die Implementierung von Klassen überschrieben werden.
- Sie können einer Schnittstelle keine neue Methode hinzufügen, ohne alle Implementierungen zu ändern, aber das ist eigentlich eine gute Sache.
Nach Java 8:
- Es gibt praktisch keinen Unterschied zwischen einer Schnittstelle und einer abstrakten Klasse (außer Mehrfachvererbung). Tatsächlich können Sie eine reguläre Klasse mit einer Schnittstelle emulieren.
- Bei der Programmierung der Implementierungen vergessen Programmierer möglicherweise, die Standardmethoden zu überschreiben.
- Es liegt ein Kompilierungsfehler vor, wenn eine Klasse versucht, zwei oder mehr Schnittstellen mit einer Standardmethode mit derselben Signatur zu implementieren.
- Durch Hinzufügen einer Standardmethode zu einer Schnittstelle erbt jede implementierende Klasse automatisch dieses Verhalten. Einige dieser Klassen wurden möglicherweise nicht mit dieser neuen Funktionalität entwickelt, was zu Problemen führen kann. Wenn beispielsweise jemand
default void foo()
einer Schnittstelle eine neue Standardmethode hinzufügtIx
, wird die Klasse , die eine private Methode mit derselben SignaturCx
implementiertIx
undfoo
besitzt, nicht kompiliert.
Was sind die Hauptgründe für diese großen Änderungen und welche neuen Vorteile (falls vorhanden) bringen sie mit sich?
@Deprecated
Kategorie! statische Methoden sind aufgrund von Unwissenheit und Faulheit eines der am häufigsten missbrauchten Konstrukte in Java. Viele statische Methoden bedeuten normalerweise inkompetente Programmierer, erhöhen die Kopplung um mehrere Größenordnungen und sind ein Albtraum für Unit-Tests und Refactors, wenn Sie erkennen, warum sie eine schlechte Idee sind!