up:: 编程技术 MOC tag::Java语言特性

接口中允许私有方法

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) {  
	// 实现方法  
	};  
}