首頁  >  文章  >  Java  >  Java9中介面的私有方法怎麼使用

Java9中介面的私有方法怎麼使用

王林
王林轉載
2023-04-13 17:31:081473瀏覽

Java 8 之前版本

Java 8 之前,介面好像只允許兩種類型的數據,一個是常數、另一個就是公開( public ) 的虛方法( abstract ),而且是虛方法哦,就是沒有任何實作的方法,因為這些方法要被類別來實作。也就是說,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##LogLog 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
Open Database connection
Log Message : INFO
Close Database connection
Open Database connection##Log Message : #Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection
Log Message : FATAL
Close Database connection



' #在這個實例中,每種類型的日誌都有自己的實作

最坑的是什麼,每個方法都要實作一遍。是的,每個方法都要實現

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
Open Database connection
Log Message : INFO##Close
Open Database connection
Log Message : INFO##Close
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 : FATALClose Database connectionOpen 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 的介面中的方法可以有預設實現,也就是使用

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 Data ##Close Database connection
Open Database connection
Log Message : ERROR
Close Database connection
Open Database connection

Log Message : FATAL
Close Database connection###Openbase connection# ##Log Message : INFO###Close Database connection###Open Database connection###Log Message : WARN###Close Database connection###Open Database connection###Log Message : ERROR###Close Data connection ###Open Database connection###Log Message : FATAL###Close Database connection######

以上是Java9中介面的私有方法怎麼使用的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:yisu.com。如有侵權,請聯絡admin@php.cn刪除