接口中允许私有方法
Java 8 使用了default
关键字,可以在接口中实现方法。假如要在 default
方法之间共用同一份代码,java 8 中需要将代码提到公共的 default
方法中调用。
public interface Java8Interface {
default void methodA(int a, int b) {
// do something
biFunction(a, b);
}
default void methodB(String a, String b) {
// do something
biFunction(a, b);
}
default void biFunction(Object a, Object b) {
// do something
}
}
问题能解决,但是却不符合接口的原则,将不必要的方法暴露出去会给调用者带来困扰。Java 9 开始接口支持使用 private
方法,代码如下:
public interface Java9Interface {
default void methodA(int a, int b) {
// do something
biFunction(a, b);
}
default void methodB(String a, String b) {
// do something
biFunction(a, b);
}
private void biFunction(Object a, Object b) {
// do something
}
}
try-with-resource 优化
try-with-resource
也是老朋友了,在 java 7 引入的,能够帮我们自动关闭流,简化代码块。
Java 7 的 try-with-resource
当 try 括号后面的包裹的代码太多,就会变成一坨很臃肿,代码如下:
try (BufferedReader br1 = new BufferedReader(…);
BufferedReader br2 = new BufferedReader(…);
BufferedReader br3 = new BufferedReader(…)) {
return br1.readLine() + br2.readLine() + br3.readLine();
}
Java 9 之后,代码如下:
BufferedReader br1 = new BufferedReader(…);
BufferedReader br2 = new BufferedReader(…);
BufferedReader br3 = new BufferedReader(…);
try (br1; br2; br3) {
return br1.readLine() + br2.readLine() + br3.readLine();
}
简化了很多,但是请注意变量虽然声明在 try 外面,但是作用范围只在 try 包裹的代码块中,try 外面使用变量会导致运行时产生错误。实例代码:
BufferedReader br1 = new BufferedReader(…);
try (br1) {
System.out.println(br1.readLine());
}
br1.readLine(); // 此时资源已关闭,调用会报错
下划线 _
不再是有效标识符
Java 9 之前可以将 _
设置为变量,虽然编译器会警告,但运行不会报错。
int _ = 123;
System.out.println(_);
Java 9 之后,编译器会提示
java: 从发行版 9 开始, '_' 为关键字, 不能用作标识符
菱形符号 <>
升级
Java 7 引入 <>
让编译器推断构造器参数类型
// java 7 之前
List<String> names = new ArrayList<String>();
// java 7 之后
List<String> names = new ArrayList<>();
Java 9 对类型推断进一步增强,支持匿名内部类的参数推断,实例代码如下:
<T> Result<T> create(T content) {
return new Result<>(content) {
// 实现方法
};
}