Java 9接口中的私有方法

时间:2020-02-23 14:36:19  来源:igfitidea点击:

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私有方法具有以下优点。

  • 无需编写重复的代码,因此具有更高的代码可重用性。

  • 我们可以选择仅向客户公开我们预期的方法实现。