ホームページ  >  記事  >  Java  >  Java9 でインターフェイスのプライベート メソッドを使用する方法

Java9 でインターフェイスのプライベート メソッドを使用する方法

王林
王林転載
2023-04-13 17:31:081473ブラウズ

Java 8 の以前のバージョン

Java 8 より前のインターフェイスでは、2 種類のデータのみが許可されているようです。1 つは定数、もう 1 つはパブリック (パブリック) 仮想メソッド (抽象) です。は仮想メソッドです。これらのメソッドはクラスによって実装する必要があるため、実装メソッドはありません。つまり、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 {

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

実行結果は次のとおりです。

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection
ログ メッセージ : INFO
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : WARN
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : ERROR
データベースを閉じる接続
データベース接続を開く
ログ メッセージ : FATAL
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : INFO
データベース接続を閉じる
データベース接続を開く
ログ メッセージ: WARN
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : ERROR
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : FATAL
データベース接続を閉じる

この例では、各タイプのログに独自の実装があります

最大の落とし穴は何ですか? 各メソッドは 1 回実装する必要があります。はい、各メソッドは

#JDK 8 バージョン

##を実装する必要があります。そして Java 8 はついにいくつかの変更を加えました。Java 8 のインターフェースには次のタイプの変数とメソッドを持つことができます

1. 定数

2. 仮想メソッド

3. デフォルト メソッド

4. 静的メソッド

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

実行結果は次のとおりです

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection

Log Message: INFO
Close Database connection
データベース接続を開く
ログ メッセージ : WARN
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : エラー
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : FATAL
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : INFO
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : WARN
データベース接続を閉じる
データベースを開く接続
ログ メッセージ: エラー
データベース接続を閉じる
データベース接続を開く
ログ メッセージ: FATAL
データベース接続を閉じる

Java 8 メソッドのインターフェイスにあるためデフォルトの実装、つまり
default

キーワード で変更されたメソッドを持つことができるため、クラスが特定のインターフェイスを実装するのは比較的簡単で、一部のメソッドを選択的に実装できます。

ただし、まだ落とし穴があります。つまり、各デフォルト メソッドのコードは完全である必要があり、他のデフォルト実装メソッドを呼び出すことはできません。

Java 9 バージョン

Java 9 では、プライベート メンバー メソッドやプライベート スタティック メソッドなど、インターフェイスにプライベート メソッドを提供できます

したがって、Java 9 のインターフェイスは次のタイプの変数とメソッドを持つことができます

1 、定数

2、仮想メソッド

3、デフォルト メソッド

4、静的メソッド

5、プライベート静的メソッド

6 、プライベート メソッド

したがって、今のインスタンスを引き続き変更して、より単純かつ明確にすることができます

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");
   }
}
実行結果は以下の通りです

$ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester
Open Database connection

Log Message : INFO
Close Database connection
Open Database connection
ログ メッセージ : WARN
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : エラー
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : FATAL
データベースを閉じる接続
データベース接続を開く
ログ メッセージ : 情報
データベース接続を閉じる
データベース接続を開く
ログ メッセージ : WARN
データベース接続を閉じる
データベース接続を開く
ログ メッセージ: エラー
データベース接続を閉じます
データベース接続を開きます
ログ メッセージ : FATAL
データベース接続を閉じます

以上がJava9 でインターフェイスのプライベート メソッドを使用する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事はyisu.comで複製されています。侵害がある場合は、admin@php.cn までご連絡ください。