Java 9 try-with-resources 改进:Effectively-final 变量直接使用
改进点
Java 7 引入 try-with-resources 要求在 try(...) 括号内声明或赋值资源变量。Java 9 放宽限制:已声明的 effectively-final 变量(仅赋值一次)可直接放入 try 括号,无需重新声明别名。
代码对比
Java 7/8 写法
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (BufferedReader br1 = br) { // 必须声明新变量 br1
return br1.readLine();
}
Java 9+ 写法
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) { // 直接使用已有 final/effectively-final 变量
return br.readLine();
}
规则细节
- 变量必须是
final或 effectively final(编译器推断仅赋值一次,未显式final修饰)。 - 变量类型必须实现
AutoCloseable或Closeable。 - 多资源用分号分隔:
try (res1; res2; res3) { ... }。 - 资源关闭顺序与声明顺序相反(后声明先关闭)。
实际价值
- 减少样板变量声明,代码更简洁。
- 避免“影子变量”导致的困惑(
br1vsbr)。 - 配合
var(Java 10+) 更简洁:try (var br = new BufferedReader(...))。
完整示例
import java.io.BufferedReader;
import java.io.IOException;
import java.io.Reader;
import java.io.StringReader;
public class Tester {
public static void main(String[] args) throws IOException {
System.out.println(readData("test"));
}
static String readData(String message) throws IOException {
Reader inputString = new StringReader(message);
BufferedReader br = new BufferedReader(inputString);
try (br) { // Java 9+ 直接使用 effectively-final 变量
return br.readLine();
}
}
}
输出:test
java
- 精通 Java 异常处理:try-catch-finally 与资源管理
- Java 面向对象核心概念全解析:抽象、封装、继承、多态与关联关系实战
- Java String length() 方法:获取字符串长度(示例)
- 精通 Java String.indexOf():定位子字符串与实战示例
- Java String.charAt() 详解:语法、返回类型、异常与实战示例
- 精通 Java String compareTo():语法、用例与实战示例
- Java String.contains() 方法:检查子字符串是否存在(实战示例)
- 精通 Java String.endsWith():检查字符串后缀(示例)
- Java BufferedReader 读取文件:实战指南与示例
- Java 插入排序算法详解:核心原理、完整代码与步骤演示
- Java 选择排序详解:核心原理、完整代码与步骤演示
- Java 8 进阶学习资源精选:官方文档、书籍与社区推荐