Java9中接口的私有方法詳解
Java 8 之前版本
Java 8 之前 ,接口好像就只允許兩種類型的數(shù)據(jù),一個(gè)是常量、另一個(gè)就是公開 ( public ) 的虛方法 ( abstract ),而且是虛方法哦,就是沒有任何實(shí)現(xiàn)的方法,因?yàn)檫@些方法要被類來實(shí)現(xiàn)。也就是說,Java 8 之前的版本不存在有著默認(rèn)實(shí)現(xiàn)的方法。
我們來看看一個(gè)示例,
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();
}運(yùn)行結(jié)果如下
$ 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
在這個(gè)實(shí)例中,每種類型的日志都有自己的實(shí)現(xiàn)
最坑的是什么,每個(gè)方法都要實(shí)現(xiàn)一遍。是的,每個(gè)方法都要實(shí)現(xiàn)
JDK 8版本
而 Java 8 也終于作出了一些改變,Java 8 中的接口,可以具有以下類型的變量和方法
1、 常量
2、 虛方法
3、 默認(rèn)方法
4、 靜態(tài)方法
我們將上面的范例改改,使用 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");
}
}運(yùn)行結(jié)果如下
$ 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
因?yàn)?Java 8 的接口中的方法可以有默認(rèn)實(shí)現(xiàn),也就是使用 default 關(guān)鍵字修飾的方法
所以,類實(shí)現(xiàn)某個(gè)接口就比較簡(jiǎn)單了,可以有選擇性的實(shí)現(xiàn)部分方法。
但是,仍然很坑,就是每個(gè)默認(rèn)方法中的代碼,都必須完整的,而且不能調(diào)用其它的默認(rèn)實(shí)現(xiàn)方法
Java 9版本
終于忍無可忍了,Java 9 中可以為接口提供私有的方法,包括私有成員方法和私有靜態(tài)方法
所以 Java 9 中的接口,可以具有以下類型的變量和方法
1、 常量
2、 虛方法
3、 默認(rèn)方法
4、 靜態(tài)方法
5、 私有靜態(tài)方法
6、 私有方法
于是,我們可以繼續(xù)修改剛剛的實(shí)例,改的更簡(jiǎn)單明白些
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");
}
}運(yùn)行結(jié)果如下
$ 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 個(gè)大的版本才達(dá)到了其它語(yǔ)言輕輕松松從創(chuàng)世開始就有的機(jī)制。
到此這篇關(guān)于Java9中接口的私有方法詳解的文章就介紹到這了,更多相關(guān)Java9接口私有方法內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)
這篇文章主要介紹了mybatis generator 配置 反向生成Entity簡(jiǎn)單增刪改查(推薦)的相關(guān)資料,非常不錯(cuò),具有參考借鑒價(jià)值,需要的朋友可以參考下2016-12-12
Springboot項(xiàng)目Maven依賴沖突的問題解決
使用Spring Boot和Maven進(jìn)行項(xiàng)目開發(fā)時(shí),依賴沖突是一個(gè)常見的問題,本文就來介紹一下Springboot項(xiàng)目Maven依賴沖突的問題解決,具有一定的參考價(jià)值,感興趣的可以了解一下2024-07-07
JAVA基于Redis實(shí)現(xiàn)計(jì)數(shù)器限流的使用示例
計(jì)數(shù)器法是限流算法里最簡(jiǎn)單也是最容易實(shí)現(xiàn)的一種算法,本文主要介紹了JAVA基于Redis實(shí)現(xiàn)計(jì)數(shù)器限流的使用示例,具有一定的參考價(jià)值,感興趣的可以了解一下2023-09-09
Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼)
這篇文章主要介紹了Java中四種9*9乘法表的實(shí)現(xiàn)方式(附代碼),文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-11-11
Nacos多環(huán)境的實(shí)現(xiàn)過程
本文介紹Nacos實(shí)現(xiàn)多環(huán)境的方案,包括單租戶和多租戶兩種類型,詳細(xì)介紹了如何在Nacos中創(chuàng)建命名空間、配置文件和項(xiàng)目,并通過配置文件的DataId和Group區(qū)分不同環(huán)境和項(xiàng)目,作者通過實(shí)戰(zhàn)場(chǎng)景展示了如何配置和啟動(dòng)項(xiàng)目,驗(yàn)證了配置文件的讀取和隔離效果2024-12-12
詳解Java并發(fā)工具類之CountDownLatch和CyclicBarrier
在JDK的并發(fā)包中,有幾個(gè)非常有用的并發(fā)工具類,它們分別是:CountDownLatch、CyclicBarrier、Semaphore和Exchanger,本文主要來講講其中CountDownLatch和CyclicBarrier的使用,感興趣的可以了解一下2023-06-06

