Java 9 : Méthodes privées dans les interfaces — Encapsulation et réutilisation
Évolution des interfaces :
- Avant Java 8 : constantes + méthodes abstraites uniquement.
- Java 8 : + méthodes
defaultetstatic. - Java 9 : + méthodes
privateetprivate static.
Problème : duplication dans les méthodes default
Avec Java 8, le code commun dans les méthodes default ne peut pas être factorisé sans l'exposer.
Solution Java 9 : méthodes privées
Les méthodes private (instance ou static) dans les interfaces permettent de factoriser le code interne sans l'exposer.
Exemple complet : logging factorisé
public class Tester {
public static void main(String[] args) {
LogOracle log = new LogOracle();
log.logInfo(""); log.logWarn(""); log.logError(""); log.logFatal("");
LogMySql log1 = new LogMySql();
log1.logInfo(""); log1.logWarn(""); log1.logError(""); log1.logFatal("");
}
}
final class LogOracle implements Logging { }
final class LogMySql implements Logging { }
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
// Méthode privée d'instance : factorise le logging
private void log(String message, String prefix) {
getConnection();
System.out.println("Log Message : " + prefix);
closeConnection();
}
default void logInfo(String message) { log(message, "INFO"); }
default void logWarn(String message) { log(message, "WARN"); }
default void logError(String message) { log(message, "ERROR"); }
default void logFatal(String message) { log(message, "FATAL"); }
// Méthodes privées static : factorisent connexion
private static void getConnection() {
System.out.println("Open Database connection");
}
private static void closeConnection() {
System.out.println("Close Database connection");
}
}
Sortie
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection
Log Message : WARN
Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection
... (répété pour LogMySql)
Résolution d'ambiguïté (multiple defaults)
Si une classe implémente deux interfaces avec la même méthode default :
- Redéfinir la méthode dans la classe.
- Ou appeler explicitement :
InterfaceA.super.method().
Méthodes static dans les interfaces (Java 8+)
Méthodes utilitaires accessibles via InterfaceName.staticMethod().
Les méthodes privées (Java 9) complètent ce modèle en permettant un vrai encapsulation au niveau interface.
Java
- Classes et méthodes abstraites en Java : guide complet
- Maîtriser les interfaces Java : concepts, implémentation et bonnes pratiques
- Maîtriser l'interface NavigableSet de Java : Navigation, tri et exemples pratiques
- Maîtriser les expressions lambda Java : Des bases à l'API Stream
- Java String toLowerCase() & toUpperCase() : Convertir la casse du texte avec prise en compte des locales
- Comprendre les interfaces Java : Définitions, Usages et Bonnes pratiques
- Comment envoyer des e-mails en Java : Guide étape par étape
- Java 9 : Méthodes factory de collections — List, Set, Map immuables simplifiés
- Java 8 : Méthodes par défaut (default) dans les interfaces — Compatibilité ascendante