Java 9 新特性:接口支持定义 private 方法
友情提示
推荐您使用 Chrome 浏览器来阅读本实战专栏,其他浏览器可能存在兼容性问题。
本章节中,我们来学习一下 Java 9 ~ 17 版本中,那些比较有用的、实际开发中能够用到的新特性。
在 Java 8 中,接口引入了 default
和 static
方法,使得我们可以在接口中编写相关方法。如星球中的第一个项目 中,就将 Mybatis Plus 操作数据库相关的代码,通过 default
默认方法封装在了 Mapper
接口中,如下图所示:
而从 Java 9 开始,接口开始支持定义 private
私有方法。本小节中,我们就来通过一个小示例,来学习一波这个新特性。
Java 8 中
首先,定义一个 Old
接口,代码如下:
public interface Old {
default void d1() {
System.out.println("Old::d1");
}
static void d2() {
System.out.println("Old::d2");
}
default void a() {
d1();
}
static void b() {
d2();
}
}
- 定义一个
d1()
默认方法,并输出一行控制台日志;- 定义一个
d2()
静态方法,并输出一行控制台日志;- 定义一个
a()
默认方法,主动调用d1()
方法;- 定义一个
b()
静态方法,主动调用d2()
方法;
接着,创建它的实现类 OldImpl
, 如下:
public class OldImpl implements Old {
}
场景描述:假设我们只想对外暴露
a()
和b()
,d1()
和d2()
都是内部定义的方法,不希望外部能够调用他们!
调用上面定义的相关方法,代码如下,会发现都是可以被调用的:
public class Main {
public static void main(String[] args) {
// 调用 a() 方法
new OldImpl().a();
// 调用 b() 方法
Old.b();
// 调用 d1() 方法
new OldImpl().d1();
// 调用 d2() 方法
Old.d2();
}
}
控制台输出如下:
Java 9 之后
Java 9 之后,接口支持了 private
关键字后,就可以实现上面的需求了,代码如下:
public interface New {
private void d1() {
System.out.println("Old::d1");
}
private static void d2() {
System.out.println("Old::d2");
}
default void a() {
d1();
}
static void b() {
d2();
}
}
注意:方法添加了
private
关键字后,就不用再添加default
关键字了,默认就表示该方法是default
。
再来调用相关方法,就发现被 private
修饰的方法无法被调用了,如下图所示: