Java 9 Métodos Privados en Interfaces: Mejorar Encapsulamiento y Reutilización de Código
Antes de Java 8, las interfaces pueden tener los siguientes tipos de variables/métodos.
- Variables constantes
- Métodos abstractos
Así que no podemos tener implementación de métodos en interfaces o, más precisamente, una implementación por defecto antes de Java 8. Ver el ejemplo.
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("Log Message: " + "INFO"); closeConnection(); }
@Override public void logWarn(String message) { getConnection(); System.out.println("Log Message: " + "WARN"); closeConnection(); }
@Override public void logError(String message) { getConnection(); System.out.println("Log Message: " + "ERROR"); closeConnection(); }
@Override public void logFatal(String message) { getConnection(); System.out.println("Log Message: " + "FATAL"); closeConnection(); }
@Override public void getConnection() { System.out.println("Abrir conexión a BD"); }
@Override public void closeConnection() { System.out.println("Cerrar conexión a BD"); }
}
final class LogMySql implements Logging {
@Override public void logInfo(String message) { getConnection(); System.out.println("Log Message: " + "INFO"); closeConnection(); }
@Override public void logWarn(String message) { getConnection(); System.out.println("Log Message: " + "WARN"); closeConnection(); }
@Override public void logError(String message) { getConnection(); System.out.println("Log Message: " + "ERROR"); closeConnection(); }
@Override public void logFatal(String message) { getConnection(); System.out.println("Log Message: " + "FATAL"); closeConnection(); }
@Override public void getConnection() { System.out.println("Abrir conexión a BD"); }
@Override public void closeConnection() { System.out.println("Cerrar conexión a BD"); }
}
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();
}
Salida
Verás la siguiente salida.
Abrir conexión a BD
Log Message: INFO
Cerrar conexión a BD
Abrir conexión a BD
Log Message: WARN
Cerrar conexión a BD
Abrir conexión a BD
Log Message: ERROR
Cerrar conexión a BD
Abrir conexión a BD
Log Message: FATAL
Cerrar conexión a BD
En el ejemplo anterior, cada método log tiene su propia implementación. Con Java 8, las interfaces pueden tener los siguientes tipos de variables/métodos.
- Variables constantes
- Métodos abstractos
- Métodos por defecto
- Métodos estáticos
Tengamos implementación por defecto y métodos estáticos en la propia interfaz usando Java 8.
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("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("Abrir conexión a BD"); }
static void closeConnection() { System.out.println("Cerrar conexión a BD"); }
}
Salida
Verás la siguiente salida.
Abrir conexión a BD
Log Message: INFO
Cerrar conexión a BD
Abrir conexión a BD
Log Message: WARN
Cerrar conexión a BD
Abrir conexión a BD
Log Message: ERROR
Cerrar conexión a BD
Abrir conexión a BD
Log Message: FATAL
Cerrar conexión a BD
En el ejemplo anterior, volvemos a tener repetición. Con Java 9, las interfaces pueden tener los siguientes tipos de variables/métodos.
- Variables constantes
- Métodos abstractos
- Métodos por defecto
- Métodos estáticos
- Métodos privados
- Métodos privados estáticos
Tengamos métodos privados y úsalos en Java 9.
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("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("Abrir conexión a BD"); }
private static void closeConnection() { System.out.println("Cerrar conexión a BD"); }
}
Salida
Verás la siguiente salida.
Abrir conexión a BD
Log Message: INFO
Cerrar conexión a BD
Abrir conexión a BD
Log Message: WARN
Cerrar conexión a BD
Abrir conexión a BD
Log Message: ERROR
Cerrar conexión a BD
Abrir conexión a BD
Log Message: FATAL
Cerrar conexión a BD
Java
- Métodos en Java: Cómo Definir, Llamar y Usarlos Efectivamente
- Modificadores de acceso en Java: Tipos, reglas y ejemplos prácticos
- Clases y métodos abstractos en Java: Guía completa
- Dominando interfaces en Java: Conceptos, implementación y mejores prácticas
- Dominando la Interfaz NavigableSet de Java: Navegación, Ordenación y Ejemplos Prácticos
- Dominando Expresiones Lambda en Java: Desde Básicos hasta Stream API
- Java String toLowerCase() y toUpperCase(): Convertir mayúsculas/minúsculas con conciencia de locale
- Entendiendo las Interfaces en Java: Definiciones, Usos y Buenas Prácticas
- Cómo enviar correos electrónicos en Java: Guía paso a paso
- Java 9 Métodos de Fábrica de Colecciones: Simplificar Creación de List, Set y Map Inmutables
- Java 8 Métodos Por Defecto Explicados: Mejorar Interfaces y Compatibilidad Hacia Atrás