Advanced Java Services | Defaultmethoden in den Interfaces Iterable und Collection |
Ein Interface kann ab Java 1.8 sowohl nichtstatische als auch statische reale Methoden enthalten. Um die nichtstatischen von den abstrakten Methoden zu unterscheiden, wird das Schlüsselwort default vor dem Returntyp ergänzt. Auf diese Weise kann man bestehende Interfaces problemlos um solche Methoden erweitern, da es bei diesen Methoden nichts (mehr) zu implementieren gibt
Hier als erstes Beispiel das Interface Iterable in 1.8 mit zwei neuen Defaultmethoden.
Wie man sieht bekommt die forEach-Methode ein Objekt vom Typ Consumer. Consumer ist ein Interfacetyp, genauer ein Functional Interface. Diese neuen Interfacetypen werden zusammen mit dem Lambdaausdrücken im übernächsten Kapitel besprochen.
Defaultmethoden können auch vererbt bzw. überschrieben werden. Das Interface Collection übernimmt (erbt) die forEach-Methode unverändert von Iterable und überschreibt die Methode spliterator(). Außerdem werden noch die Defaultmethoden parallelStream() und stream() eingeführt. Diese stream-Methoden arbeiten hervorragend mit dem neuen Lambdakonzept zusammen und sind daher sehr wichtig.
Natürlich kann man die neuen Features auch in eigene Interfaces einbauen. Hier ein einfaches Beispiel.
/** * Bricht den Kontrakt nicht, weil es nichts zu implementieren gibt. * Angenommen, das Interface existierte schon vor 1.8, dann kann dieses Interface * um default- und statische Methoden erweitert werden. */ interface DefaultMethod { // abstract method void foo(); //default method default void defaultMethod() { System.out.println("defaultMethod"); } static void staticMethod() { System.out.println("staticMethod"); } }