English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Основной учебник Java

Java процесс управления

Java Массивы

Java Ориентированность на объекты (I)

Java Ориентированность на объекты (II)

Java Ориентированность на объекты (III)

Обработка исключений в Java

Java Списки (List)

Java Очереди (Queue)

Java Словари (Map)

Java Множества (Set)

Java Вход/Вывод (I/O)

Java Reader/Writer

Другие темы Java

Приватные методы интерфейсов в 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("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("Открыть соединение с базой данных");
   }
   @Override
   public void closeConnection() {
      System.out.println("Закрыть соединение с базой данных");
   }
}
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("Открыть соединение с базой данных");
   }
   @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();
}

Выполнение примера выводит результат:

Открыть соединение с базой данных
Запись сообщения: Информация
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Предупреждение
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Ошибка
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Катастрофическая
Закрыть соединение с базой данных

В данном примере каждый метод логирования имеет свою реализацию.

В 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("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("Открыть соединение с базой данных");
   }
   static void closeConnection() {
      System.out.println("Закрыть соединение с базой данных");
   }
}

Выполнение примера выводит результат:

Открыть соединение с базой данных
Запись сообщения: Информация
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Предупреждение
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Ошибка
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Катастрофическая
Закрыть соединение с базой данных

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("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, "Ошибка");
   }
   default void logFatal(String message) {
      log(message, "Катастрофическая");
   }
   private static void getConnection() {
      System.out.println("Открыть соединение с базой данных");
   }
   private static void closeConnection() {
      System.out.println("Закрыть соединение с базой данных");
   }
}

Выполнение примера выводит результат:

Открыть соединение с базой данных
Запись сообщения: Информация
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Предупреждение
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Ошибка
Закрыть соединение с базой данных
Открыть соединение с базой данных
Запись сообщения: Катастрофическая
Закрыть соединение с базой данных

Java новые возможности 9