Java 8 Default Methods: Interfaces mit Implementierung & Backward Compatibility
Motivation
Vor Java 8 waren Interfaces rein abstrakt. Neue Methoden (z. B. forEach in Collection) hätten alle existierenden Implementierungen gebrochen. Default Methods lösen dies: Interfaces können Implementierungen bereitstellen, die Implementierer nicht überschreiben müssen.
Syntax
public interface Fahrzeug {
default void hupen() {
System.out.println("Tüt-tüt!");
}
}
Mehrfache Default-Methoden – Konfliktlösung
Eine Klasse implementiert zwei Interfaces mit gleicher Default-Methode → Compiler-Fehler. Zwei Lösungen:
1. Eigene Implementierung (Override)
interface Fahrzeug { default void hupen() { System.out.println("Fahrzeug hupt"); } }
interface VierRad { default void hupen() { System.out.println("VierRad hupt"); } }
class Auto implements Fahrzeug, VierRad {
public void hupen() { System.out.println("Auto hupt eigenständig"); }
}
2. Expliziter Super-Call
class Auto implements Fahrzeug, VierRad {
public void hupen() {
Fahrzeug.super.hupen(); // oder VierRad.super.hupen()
}
}
Static Methods in Interfaces
Seit Java 8 auch static Methoden erlaubt – Hilfsfunktionen, Factory-Methoden:
interface Fahrzeug {
default void hupen() { System.out.println("Tüt-tüt"); }
static String typ() { return "KFZ"; }
}
Aufruf: Fahrzeug.typ() (nicht vererbbar, nicht überschreibbar).
Vollständiges Beispiel
public class DefaultDemo {
public static void main(String[] args) {
Fahrzeug f = new Auto();
f.hupen();
}
}
interface Fahrzeug {
default void hupen() { System.out.println("Ich bin ein Fahrzeug!"); }
static void hupeLos() { System.out.println("Hupe los!!!"); }
}
interface VierRad {
default void hupen() { System.out.println("Ich bin ein Vierrad!"); }
}
class Auto implements Fahrzeug, VierRad {
public void hupen() {
Fahrzeug.super.hupen();
VierRad.super.hupen();
Fahrzeug.hupeLos();
System.out.println("Ich bin ein Auto!");
}
}
Ausgabe:
Ich bin ein Fahrzeug!
Ich bin ein Vierrad!
Hupe los!!!
Ich bin ein Auto!
Regeln & Best Practices
- Default-Methoden sind virtuell – können überschrieben werden.
defaultMethoden könnenstaticMethoden des Interfaces aufrufen.- Nicht für Zustandsänderungen (Felder) nutzen – Interfaces haben keine Instanzfelder.
- Für API-Evolution gedacht, nicht als Ersatz für Abstract Classes (die Konstruktor, State, private Methods haben).
- Diamond-Problem gelöst durch expliziten
X.super.m()Call.
Fazit
Default Methods ermöglichen Interface-Evolution ohne Breaking Changes – der Schlüssel für die Collection-API-Erweiterung in Java 8 (forEach, stream, removeIf, …). Nutzen Sie sie für optionale Verhalten, nicht für Kernlogik.
Java
- Java Operatoren meistern: Typen, Syntax und praktische Beispiele
- Java Kommentare: Typen, Verwendung und Best Practices
- Java Enhanced For-Schleife meistern: Syntax, Beispiele und Best Practices
- Java Strings meistern: Erstellung, Methoden und Best Practices
- Java abstrakte Klassen und Methoden: Ein umfassender Leitfaden
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java anonyme innere Klassen meistern: Definition, Syntax und praktische Beispiele
- Java Try-With-Resources meistern: Automatisches Ressourcenmanagement erklärt
- Java Annotations erklärt: Typen, Platzierung und praktische Beispiele
- Java Assertions: Praktischer Leitfaden zur Fehlererkennung und Code-Reliabilität