Java 9 Private Interface Methods: Bessere Kapselung & Code-Wiederverwendung
Entwicklung der Interfaces
| Version | Erlaubte Mitglieder |
|---|---|
| ≤ Java 7 | Konstanten, abstract Methoden |
| Java 8 | + default Methoden, static Methoden |
| Java 9 | + private Methoden, private static Methoden |
Motivation
default Methoden ermöglichen Implementierungen in Interfaces, führen aber oft zu Code-Duplikation, wenn mehrere Default-Methoden gemeinsame Logik teilen. private Methoden lösen dies: Sie sind nur im Interface sichtbar und können von default / static Methoden aufgerufen werden.
Beispiel: Logging-Interface
Vor Java 8 – Code-Duplikation in Implementierungen
interface Logging {
void logInfo(String msg);
void logWarn(String msg);
void logError(String msg);
void logFatal(String msg);
void getConnection();
void closeConnection();
}
class LogOracle implements Logging { ... } // alle Methoden implementiert, viel Duplikation
class LogMySql implements Logging { ... } // dito
Java 8 – Default & Static Methoden im Interface
interface Logging {
default void logInfo(String msg) { log(msg, "INFO"); }
default void logWarn(String msg) { log(msg, "WARN"); }
default void logError(String msg) { log(msg, "ERROR"); }
default void logFatal(String msg) { log(msg, "FATAL"); }
// Problem: log() muss default/static sein → öffentlich sichtbar!
static void log(String msg, String level) { ... }
static void getConnection() { ... }
static void closeConnection() { ... }
}
Java 9 – Private Methoden für echte Kapselung
interface Logging {
// Private Hilfsmethode – nicht nach außen sichtbar
private void log(String msg, String level) {
getConnection();
System.out.println("Log: " + level + " - " + msg);
closeConnection();
}
default void logInfo(String msg) { log(msg, "INFO"); }
default void logWarn(String msg) { log(msg, "WARN"); }
default void logError(String msg) { log(msg, "ERROR"); }
default void logFatal(String msg) { log(msg, "FATAL"); }
private static void getConnection() { System.out.println("DB connect"); }
private static void closeConnection() { System.out.println("DB close"); }
}
class LoggerA implements Logging {}
class LoggerB implements Logging {}
Ausgabe bei Nutzung:
DB connect
Log: INFO - test
DB close
DB connect
Log: WARN - test
DB close
...
Regeln für private Interface-Methoden
privateInstanzmethoden: Können vondefaultMethoden aufgerufen werden.private staticMethoden: Können vondefault&staticMethoden aufgerufen werden.- Nicht von
abstractMethoden (kein Body). - Nicht überschreibbar / nicht in Subinterfaces sichtbar.
- Können nicht von implementierenden Klassen aufgerufen werden.
Vorteile
- DRY (Don't Repeat Yourself): Gemeinsame Logik einmal definieren.
- Kapselung: Implementierungsdetails bleiben im Interface verborgen.
- Binäre Kompatibilität: Private Methoden ändern sich nicht die öffentliche API.
- Testbarkeit: Interface-Logik kann via implementierende Test-Klasse indirekt geprüft werden.
Fazit
Private Interface-Methoden schließen eine Lücke in Java 8s Default-Methoden-Design und machen Interfaces zu echten, gekapselten Implementierungsträgern – ohne Implementierungsklassen zu belasten.
Java
- Java Methoden: Definieren, Aufrufen und Effektiv Nutzen
- Java abstrakte Klassen und Methoden: Ein umfassender Leitfaden
- Java-Schnittstellen meistern: Konzepte, Implementierung und Best Practices
- Java NavigableSet Interface meistern: Navigation, Sortierung und praktische Beispiele
- Java Lambda Expressions meistern: Von Grundlagen bis Stream API
- Java String toLowerCase() & toUpperCase(): Text-Groß-/Kleinschreibung mit Locale-Bewusstsein konvertieren
- Java Interfaces verstehen: Definitionen, Verwendung und Best Practices
- E-Mails in Java versenden: Schritt-für-Schritt-Anleitung
- Java 9 Collection Factory Methods: Unveränderliche List, Set & Map kompakt erzeugen
- Java 8 Default Methods: Interfaces mit Implementierung & Backward Compatibility