Java 9 Private Interface Methods: Encapsulatie & herbruik verbeteren
Voor Java 8 konden interfaces alleen:
- Constanten
- Abstracte methodes
Geen methode-implementaties (default implementaties) waren mogelijk. Zie het voorbeeld:
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";
void logInfo(String message);
void logWarn(String message);
void logError(String message);
void logFatal(String message);
void getConnection();
void closeConnection();
}
Elke log-methode heeft een eigen implementatie met herhaling.
Met Java 8 kunnen interfaces ook default methodes en statische methodes hebben. Laten we default-implementatie en statische methodes in de interface plaatsen:
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
default void logInfo(String message) { getConnection(); System.out.println("Log Message : INFO"); closeConnection(); }
default void logWarn(String message) { getConnection(); System.out.println("Log Message : WARN"); closeConnection(); }
default void logError(String message) { getConnection(); System.out.println("Log Message : ERROR"); closeConnection(); }
default void logFatal(String message) { getConnection(); System.out.println("Log Message : FATAL"); closeConnection(); }
static void getConnection() { System.out.println("Open Database connection"); }
static void closeConnection() { System.out.println("Close Database connection"); }
}
Nu is er nog steeds herhaling in de default-methodes.
Met Java 9 mogen interfaces ook private methodes en private static methodes hebben. We kunnen nu private helper-methodes gebruiken:
interface Logging {
String ORACLE = "Oracle_Database";
String MYSQL = "MySql_Database";
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"); }
private static void getConnection() { System.out.println("Open Database connection"); }
private static void closeConnection() { System.out.println("Close Database connection"); }
}
De implementerende klassen LogOracle en LogMySql zijn nu leeg. Uitvoer blijft hetzelfde.
Java
- Java-methodes: definiëren, aanroepen en effectief gebruiken
- Java-toegangsmodificaties begrijpen: typen, regels en praktische voorbeelden
- Java abstracte klassen en methoden: een uitgebreide gids
- Java interfaces meesteren: concepten, implementatie en best practices
- Java NavigableSet interface: Navigatie, sortering en praktische voorbeelden
- Java Lambda-expressies: Van basis tot Stream API
- Java String toLowerCase() & toUpperCase(): Tekstcase Converteren met Locale Awareness
- Java Interfaces begrijpen: Definities, Gebruik en Best Practices
- E-mails versturen in Java: Een stapsgewijze handleiding
- Java 9 Collection Factory Methods: Onveranderlijke List, Set & Map eenvoudig aanmaken
- Java 8 Default Methods: Interfaces verbeteren & backward compatibility