Java Java9 九、Java 9 新特性 – 接口 ( interface ) 的私有方法 云少 2018-11-09 2018-11-09 九、Java 9 新特性 – 接口 ( interface ) 的私有方法 master ,这是我的小站 ,欢迎访问哦~~
在我的印象中,好像,从来没有,想过在 interface
中定义私有的方法。一来各种文档中的确没有这么介绍过,二来,好像从来没有谁这么做过,三来,好像定义了也不知道要怎么使用,毕竟,接口 interface
中的方法都会被具体的类重写一次,所以,似乎,私有方法都没啥大作用了。
比如说,很简单的,我们的 Java 基础教程: Java 接口 中,就没有论述私有方法这回事。
既然 Java 9 添加了这项特性,那么,应该就有它的用途,我们一起来看看 Java 9 中的接口的私有方法是什么样的吧。
JDK 7 / JDK 6 回忆一下,Java 8 之前 ,接口好像就只允许两种类型的数据,一个是常量、另一个就是公开 ( public ) 的虚方法 ( abstract ),而且是虚方法哦,就是没有任何实现的方法,因为这些方法要被类来实现。
也就是说,Java 8 之前的版本不存在有着默认实现的方法
我们来看看一个示例,在我们的工作区创建一个文件 InterfacePrivateMethodTester.java
,并输入一下内容
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 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 () ; }
运行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 $ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester 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 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
在这个实例中,每种类型的日志都有自己的实现
最坑的是什么,每个方法都要实现一遍。是的,每个方法都要实现
JDK 8 而 Java 8 也终于作出了一些改变,Java 8 中的接口,可以具有以下类型的变量和方法
1、 常量
2、 虚方法
3、 默认方法
4、 静态方法
我们将上面的范例改改,使用 Java 8 的特性
InterfacePrivateMethodTester.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 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" ); } }
运行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 $ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester 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 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 的接口中的方法可以有默认实现,也就是使用 default
关键字修饰的方法
所以,类实现某个接口就比较简单了,可以有选择性的实现部分方法。
但是,仍然很坑,就是每个默认方法中的代码,都必须完整的,而且不能调用其它的默认实现方法
Java 9 终于忍无可忍了,Java 9 中可以为接口提供私有的方法,包括私有成员方法和私有静态方法
所以 Java 9 中的接口,可以具有以下类型的变量和方法
1、 常量
2、 虚方法
3、 默认方法
4、 静态方法
5、 私有静态方法
6、 私有方法
于是,我们可以继续修改刚刚的实例,改的更简单明白些
InterfacePrivateMethodTester.java 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 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" ); } }
运行结果如下
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 $ javac InterfacePrivateMethodTester.java && java InterfacePrivateMethodTester 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 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 竟然用了 2 个大的版本才达到了其它语言轻轻松松从创世开始就有的机制