Приватные методы интерфейсов в Java 9
Новые возможности Java 9
До 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 {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Открытие соединения с базой данных");
}
@Override
public void closeConnection() {
System.out.println("Закрытие соединения с базой данных");
}
}
final class LogMySql implements Logging {
@Override
public void logInfo(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "INFO");
closeConnection();
}
@Override
public void logWarn(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "WARN");
closeConnection();
}
@Override
public void logError(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "ERROR");
closeConnection();
}
@Override
public void logFatal(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "FATAL");
closeConnection();
}
@Override
public void getConnection() {
System.out.println("Открытие соединения с базой данных");
}
@Override
public void closeConnection() {
System.out.println("Закрыть соединение с базой данных");
}
}
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();
}
Вывод приведенного выше примера:
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 8 в интерфейсах появились некоторые новые возможности — методы по умолчанию и статические методы. Мы можем писать реализации методов в интерфейсах в Java SE 8, просто используя ключевое словоdefaultдля их определения.
В 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("Сообщение журнала : " + "INFO");
closeConnection();
}
default void logWarn(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "WARN");
closeConnection();
}
default void logError(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "ERROR");
closeConnection();
}
default void logFatal(String message) {
getConnection();
System.out.println("Сообщение журнала : " + "FATAL");
closeConnection();
}
static void getConnection() {
System.out.println("Открыть соединение с базой данных");
}
static void closeConnection() {
System.out.println("Закрыть соединение с базой данных");
}
}
Вывод приведенного выше примера:
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 не только поддерживает методы интерфейса по умолчанию, как Java 8, но также поддерживает приватные методы.
В 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("Сообщение журнала : " + 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("Закрыть соединение с базой данных");
}
}
Вывод приведенного выше примера:
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
Другие расширения