Méthodes privées d'interface Java 9
Nouveautés de Java 9
Avant Java 8, les interfaces pouvaient avoir des variables constantes et des méthodes abstraites.
Nous ne pouvions pas fournir d'implémentations de méthodes dans les interfaces. Si nous voulions fournir une combinaison de méthodes abstraites et de méthodes non abstraites (méthodes avec implémentations), nous devions utiliser une classe abstraite.
Exemple
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 {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Message de journal : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Message de journal : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Message de journal : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Message de journal : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Ouverture de la connexion à la base de données");
}
@Override
public void closeConnection() {
System.out.println("Fermeture de la connexion à la base de données");
}
}
final class LogMySql implements Logging {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Message de journal : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Message de journal : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Message de journal : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Message de journal : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Ouverture de la connexion à la base de données");
}
@Override
public void closeConnection() {
System.out.println("Fermer la connexion à la base de données");
}
}
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
void logInfo(String message);
void logWarn(String message);
void logError(String message);
void logFatal(String message);
void getConnection();
void closeConnection();
}
La sortie de l'exemple ci-dessus est :
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
Dans l'exemple ci-dessus, chaque méthode de journalisation a sa propre implémentation.
Dans Java 8, les interfaces ont introduit de nouvelles fonctionnalités — les méthodes par défaut et les méthodes statiques. Nous pouvons écrire des implémentations de méthodes dans les interfaces dans Java SE 8, simplement en utilisant le mot-clédefaultpour les définir.
Dans Java 8, une interface peut définir les types suivants de variables/méthodes:
- Constantes
- Méthodes abstraites
- Méthodes par défaut
- Méthodes statiques
Exemple
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";
default void logInfo(String message) {
getConnection();
System.out.println("Message de journal : " + "INFO");
closeConnection();
}
default void logWarn(String message) {
getConnection();
System.out.println("Message de journal : " + "WARN");
closeConnection();
}
default void logError(String message) {
getConnection();
System.out.println("Message de journal : " + "ERROR");
closeConnection();
}
default void logFatal(String message) {
getConnection();
System.out.println("Message de journal : " + "FATAL");
closeConnection();
}
static void getConnection() {
System.out.println("Ouvrir la connexion à la base de données");
}
static void closeConnection() {
System.out.println("Fermer la connexion à la base de données");
}
}
La sortie de l'exemple ci-dessus est :
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
Java 9 prend non seulement en charge les méthodes par défaut d'interface, comme Java 8, mais prend également en charge les méthodes privées.
En Java 9, une interface peut définir les types suivants de variables/méthodes :
- Constantes
- Méthodes abstraites
- Méthodes par défaut
- Méthodes statiques
- Méthodes privées
- Méthodes statiques privées
L'exemple suivant extrait le code redondant dans une méthode commune, ce qui semble nettement plus propre :
Exemple
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";
private void log(String message, String prefix) {
getConnection();
System.out.println("Message de journal : " + 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");
}
private static void getConnection() {
System.out.println("Ouvrir la connexion à la base de données");
}
private static void closeConnection() {
System.out.println("Fermer la connexion à la base de données");
}
}
La sortie de l'exemple ci-dessus est :
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
Nouveautés de Java 9
Autres extensions