Default Methoden (Interfaces in Java)
Kurzüberblick / Definition¶
Default Methoden sind Methoden in Java-Interfaces, die bereits eine konkrete Implementierung enthalten.
- Eingeführt mit Java 8
- Ziel: Interfaces erweitern, ohne bestehende Implementierungen zu brechen
- Verwendung des Schlüsselworts
default - Können von implementierenden Klassen optional überschrieben werden
Core-Erklärung¶
Warum das in der Praxis existiert¶
In realen Systemen (Frameworks, APIs, Libraries):
- Viele Klassen implementieren dasselbe Interface
- Interfaces entwickeln sich im Laufe der Zeit weiter
Ohne Default Methoden müssten bei jeder Erweiterung alle bestehenden Implementierungen angepasst werden.
Praxisbeispiele¶
1. E-Commerce Plattform – Zahlungsabwicklung¶
public interface PaymentService {
void pay(double amount);
default double applyDiscount(double amount) {
return amount;
}
}
Implementierung einer bestehenden Zahlungsart:
public class CreditCardPayment implements PaymentService {
@Override
public void pay(double amount) {
System.out.println("Bezahlt mit Kreditkarte: " + amount);
}
}
Spezialisierte Zahlungsart mit Rabatt:
public class VipPayment implements PaymentService {
@Override
public void pay(double amount) {
double finalAmount = applyDiscount(amount);
System.out.println("VIP bezahlt: " + finalAmount);
}
@Override
public double applyDiscount(double amount) {
return amount * 0.9;
}
}
2. Collections – Erweiterung von Funktionalität¶
public interface SimpleList<T> {
void add(T element);
default void addAll(List<T> elements) {
for (T e : elements) {
add(e);
}
}
}
3. Logging in Services¶
public interface Service {
void execute();
default void logError(Exception e) {
System.err.println("[ERROR] " + e.getMessage());
}
}
Verwendung:
public class OrderService implements Service {
@Override
public void execute() {
try {
System.out.println("Bestellung wird verarbeitet...");
throw new RuntimeException("Datenbankfehler");
} catch (Exception e) {
logError(e);
}
}
}
4. API-Weiterentwicklung¶
public interface UserService {
String getUserName(int id);
default void logAccess(int id) {
System.out.println("User accessed: " + id);
}
}
Wichtige Konzepte¶
Unterschied zu abstrakten Methoden¶
| Merkmal | Abstrakte Methode | Default Methode |
|---|---|---|
| Implementierung | Nein | Ja |
| Muss implementiert werden | Ja | Nein |
| Erweiterbarkeit | Eingeschränkt | Flexibel |
Unterschied zu static Methoden¶
| Merkmal | Default Methode | Static Methode |
|---|---|---|
| Aufruf über Objekt | Ja | Nein |
| Aufruf über Interface | Nein | Ja |
| Überschreibbar | Ja | Nein |
Mehrfachvererbung – Konfliktfall¶
interface A {
default void hello() {
System.out.println("A");
}
}
interface B {
default void hello() {
System.out.println("B");
}
}
class C implements A, B {
@Override
public void hello() {
A.super.hello();
}
}
Exam-Relevanz¶
- Zweck von Default Methoden
- Unterschied zu abstrakten und statischen Methoden
- Verhalten bei Erweiterung von Interfaces
- Konfliktlösung bei Mehrfachvererbung
Best Practices¶
Geeignet für:
- Erweiterung bestehender Interfaces
- Gemeinsame Standardlogik
- Kleine, wiederverwendbare Funktionalität
Nicht geeignet für:
- Komplexe Geschäftslogik
- Zustandsbehaftete Logik
- Unübersichtliche Interface-Strukturen
Häufige Fehler¶
- Zu viel Logik im Interface
- Verwechslung mit statischen Methoden
- Ignorieren von Konflikten bei Mehrfachvererbung
Fazit¶
Default Methoden ermöglichen die Erweiterung von Interfaces bei gleichzeitiger Wahrung der Abwärtskompatibilität. Sie sind ein zentrales Werkzeug für wartbare und evolvierbare API-Designs.