Java 9 Métodos Privados em Interfaces: Aumentando Encapsulamento e Reuso de Código
Antes do Java 8, interfaces podiam ter:
- Variáveis constantes
- Métodos abstratos
Não era possível ter implementação de métodos em interfaces. Veja o exemplo com duplicação de código:
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();
}
// Duas implementações repetindo getConnection/closeConnection em cada método de log...
Com Java 8, interfaces ganharam métodos default e métodos static, permitindo implementação padrão na interface:
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"); }
}
Mas ainda há repetição nos métodos default. Com Java 9, interfaces podem ter:
- Variáveis constantes
- Métodos abstratos
- Métodos default
- Métodos static
- Métodos private
- Métodos private static
Usando Métodos Privados no 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("Open Database connection"); }
private static void closeConnection() { System.out.println("Close Database connection"); }
}
Saída
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
Métodos privados em interfaces eliminam duplicação de código entre métodos default/static, melhorando encapsulamento e manutenibilidade.
Java
- Métodos em Java: Como Definir, Chamar e Usar Eficazmente
- Classes e Métodos Abstratos em Java: Guia Completo
- Dominando Interfaces em Java: Conceitos, Implementação e Boas Práticas
- Dominando a Interface NavigableSet do Java: Navegação, Ordenação e Exemplos Práticos
- Dominando Expressões Lambda em Java: Do Básico à Stream API
- Java String toLowerCase() & toUpperCase(): Converter Caixa de Texto com Consciência de Locale
- Entendendo Interfaces em Java: Definições, Usos e Boas Práticas
- Como Enviar E-mails em Java: Guia Passo a Passo
- Java 9 Collection Factory Methods: Simplifique Criação de List, Set e Map Imutáveis
- Java 8 Default Methods Explicados: Aprimorando Interfaces e Compatibilidade Reversa