Java 9接口中的私有方法
Java 9已发布,并且进行了许多更改。
今天,我们将研究接口更改中的Java 9私有方法。
Java 9接口中的私有方法
在最近的Java版本中,接口有很多更改。
在本文中,我仅提供伪代码来理解此新功能,因为每个人都知道Java中的接口是什么,Java中的私有方法是什么。
Java 7接口
在Java SE 7或者更早版本中,接口只能有两种类型的东西。
- 常数变数
- 抽象方法
我们无法在接口中提供方法实现。
如果我们要提供抽象方法和非抽象方法(带有实现方法的方法)的组合,则只能选择抽象类。
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; void logInfo(String message); void logWarn(String message); void logError(String message); void logFatal(String message); }
其中我们定义了几个常量和公共抽象方法。
如果我想在这里为这些方法提供一些实现,例如默认实现,该怎么办?然后,我们应该使用Java 7或者更早版本的抽象类。
Java 8接口更改
Oracle Corporation引入了一些新功能来与Java 8 Release接口。
这是默认方法和静态方法功能。
是的,我们可以从Java 8开始在Interface中编写方法实现。
我们需要使用" default"关键字来定义它们,如下所示。
在Java 8中,接口只能包含四种内容:
- 常数变数
- 抽象方法
- 默认方法
- 静态方法
Java 8接口更改中添加了默认方法和静态方法。
public interface DBLogging{ String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; //abstract method example void logInfo(String message); //default method example default void logWarn(String message){ //Step 1: Connect to DataStore //Step 2: Log Warn Message //Step 3: Close the DataStore connection } default void logError(String message){ //Step 1: Connect to DataStore //Step 2: Log Error Message //Step 3: Close the DataStore connection } default void logFatal(String message){ //Step 1: Connect to DataStore //Step 2: Log Fatal Message //Step 3: Close the DataStore connection } //static method example static boolean isNull(String str) { System.out.println("Interface Null Check"); return str == null ? true : "".equals(str) ? true : false; } //Any other abstract, default, static methods }
上面的示例显示了我们在Java 8接口中可以做的所有事情,请注意另外的默认和静态方法集。
您是否注意到所有日志方法中的代码冗余?每种方法都是自己打开和关闭连接。
如果我们想重复使用代码,则必须将这些通用代码移至公共方法,但是所有其他类都可以访问它。
如果我们想重用代码但又不想将代码公开给别人怎么办?对于通用代码,我们将不得不使用带有私有方法的抽象类。
Java 9接口更改
为了解决上述情况,Oracle Corporation在Java 9版本中的接口中引入了私有方法。
从Java 9开始,我们可以使用如下所示的" private"访问修饰符在接口中编写私有方法(就像其他私有方法一样)。
在Java 9和更高版本中,接口可以包含六种内容:
- 常数变数
- 抽象方法
- 默认方法
- 静态方法
- 私人方法
- 私有静态方法
Java 9接口更改中添加了私有方法和私有静态方法。
public interface DBLogging { String MONGO_DB_NAME = "ABC_Mongo_Datastore"; String NEO4J_DB_NAME = "ABC_Neo4J_Datastore"; String CASSANDRA_DB_NAME = "ABC_Cassandra_Datastore"; 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 void log(String message, String msgPrefix) { //Step 1: Connect to DataStore //Step 2: Log Message with Prefix and styles etc. //Step 3: Close the DataStore connection } //Any other abstract, static, default methods }
其中我们已将冗余代码移至通用的私有方法中,以便我们的API客户端无法看到它们。
请注意下图来自支持Java 9的Eclipse Oxygen。
在接口中定义私有方法的规则?
在接口中编写私有方法时,我们应遵循以下规则:
我们应该使用private修饰符来定义这些方法。
没有私有和抽象修饰符在一起,它将给编译器错误。
这不是一个新规则。
我们不能使用私有修饰符和抽象修饰符的组合,因为两者都有不同的含义。
"私有"方法表示完全实现的方法,因为子类无法继承和覆盖此方法。
"抽象"方法是指不执行方法。
其中子类应该继承并重写此方法。
这就是为什么私有方法应完全实现的原因。
私有方法必须包含主体。
可访问性不比private修饰符低。
In Java, as we know private is the least visible access modifier. So we cannot reduce it's visibility from private to any other modifier.
这些接口专用方法仅在该接口内有用或者可访问。
我们不能从一个接口访问或者继承私有方法到另一个接口或者类。
为什么在接口中需要私有方法?
接口中的Java 9私有方法具有以下优点。
无需编写重复的代码,因此具有更高的代码可重用性。
我们可以选择仅向客户公开我们预期的方法实现。