Maison  >  Article  >  Java  >  Comment utiliser les méthodes privées des interfaces en Java9

Comment utiliser les méthodes privées des interfaces en Java9

王林
王林avant
2023-04-13 17:31:081473parcourir

Versions pré-Java 8

Avant Java 8, l'interface semble n'autoriser que deux types de données, l'une est une constante, l'autre est une méthode virtuelle publique (publique) (abstraite), et c'est une méthode virtuelle, mais il n'y a pas d'implémentation de méthodes, car ces méthodes doivent être implémentées par la classe. En d’autres termes, il n’existe aucune méthode avec implémentation par défaut dans les versions antérieures à Java 8.

Jetons un coup d'œil à un exemple,

public class InterfacePrivateMethodTester {

   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("Open Database connection");
   }
   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}


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("Open Database connection");
   }
   @Override
   public void closeConnection() {
      System.out.println("Close Database connection");
   }
}


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();
}

Le résultat en cours d'exécution est le suivant

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données

Dans ce cas, chaque type de journal a sa propre implémentation

Quel est le plus gros écueil ? Chaque méthode doit être à nouveau mise en œuvre. Oui, chaque méthode doit être implémentée

Version JDK 8

Et Java 8 a finalement apporté quelques modifications. L'interface de Java 8 peut avoir les types de variables et de méthodes suivants

1 Constantes

Méthode virtuelle

. 3, Méthode par défaut

4, Méthode statique

Nous modifions l'exemple ci-dessus et utilisons les fonctionnalités de Java 8

public class InterfacePrivateMethodTester {
   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("Open Database connection");
   }
   static void closeConnection() {
      System.out.println("Close Database connection");
   }
}

Les résultats d'exécution sont les suivants

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Connexion à la base de données ouverte
Journal Message : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données

Parce que les méthodes dans les interfaces Java 8 peuvent avoir des implémentations par défaut, c'est-à-dire des méthodes modifiées avec des defaultmots-clés

Il est donc relativement simple pour une classe d'implémenter une certaine interface, et certaines méthodes peuvent être implémentées de manière sélective.

Cependant, cela reste très déroutant, c'est-à-dire que le code de chaque méthode par défaut doit être complet et que les autres méthodes d'implémentation par défaut ne peuvent pas être appelées

Version Java 9

Enfin, je n'en peux plus. Java 9, des interfaces privées peuvent être fournies comme méthodes, y compris des méthodes membres privées et des méthodes statiques privées

Ainsi, les interfaces dans Java 9 peuvent avoir les types de variables et de méthodes suivants

1 Constantes

2. méthodes

4. Méthodes statiques

5. Méthode statique privée

6. Méthode privée

Donc, nous pouvons continuer à modifier l'instance tout à l'heure, la rendant plus simple et plus claire

InterfacePrivateMethodTester.java

public class InterfacePrivateMethodTester {
   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");
   }
}
Le les résultats en cours d'exécution sont les suivants

$ javac InterfacePrivateMethodTester .java && java InterfacePrivateMethodTester
Ouvrir la connexion à la base de données

Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : INFO
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : WARN
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Journal Message : ERREUR
Fermer la connexion à la base de données
Ouvrir la connexion à la base de données
Message du journal : FATAL
Fermer la connexion à la base de données

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Cet article est reproduit dans:. en cas de violation, veuillez contacter admin@php.cn Supprimer