Приватные методы интерфейсов в Java 9

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 新特性Новые возможности Java 9

Другие расширения