优先用 try-with-resources,它更标准、更安全;@cleanup 是语法糖补充,适合不能实现 autocloseable 的老接口或临时场景。

Java 的 try-with-resources 和 Lombok 的 @Cleanup 都是用来自动释放资源的,但它们机制不同、适用场景也不同。简单说:优先用 try-with-resources,它更标准、更安全;@Cleanup 是语法糖补充,适合不能实现 AutoCloseable 的老接口或临时场景。
什么时候该用 try-with-resources
当你操作的对象实现了 java.lang.AutoCloseable(比如 FileInputStream、BufferedReader、Connection、PreparedStatement 等),就直接用 try-with-resources:
try (FileInputStream fis = new FileInputStream("a.txt");
BufferedReader br = new BufferedReader(new InputStreamReader(fis))) {
String line = br.readLine();
System.out.println(line);
} // 自动调用 fis.close() 和 br.close()
- 支持多个资源,按声明逆序关闭(后声明的先关)
- 即使发生异常,close() 也会执行,且异常不会掩盖原始异常(会作为 suppressed exception 附加)
- JDK 7+ 原生支持,无需额外依赖,IDE 和静态分析工具都友好
什么时候考虑 @Cleanup
@Cleanup 是 Lombok 提供的编译期注解,会在变量作用域结束前自动插入 close() 调用(默认找 close() 方法,也可指定其他方法名)。适用于:
- 老代码中资源类没实现
AutoCloseable,但有类似dispose()、release()方法 - 需要在非 try 块中做“作用域结束即清理”的逻辑(比如方法末尾、if 分支内)
- 配合非标准资源(如某些第三方库的上下文对象、锁、临时文件句柄等)
示例:
@Cleanup("dispose") SomeLegacyResource res = new SomeLegacyResource();
res.doSomething(); // 方法结束后自动调用 res.dispose()
注意:@Cleanup 不处理异常 —— 如果 close() 抛异常,会中断当前流程,且无法像 try-with-resources 那样抑制或合并异常。
你接手一个需求时,是不是经常这样:"改一个小字段 → 结果把不相关的代码也改了"、"需求说得很模糊 → 做着做着发现跑偏了"、"数据库加个字段 → 上线才发现漏了数据兼容"、"做了个新功能 → 一个月后自己都忘了当时怎么设计的"、"写到一半被中断 → 再回来不知道从哪继续";这个 Skill 就是专门解决这些问题的。 它会自动探测你的项目环境(JDK、Spring Boot、ORM、数据库、前端框架),记在
别混用,也别误以为 @Cleanup 更“高级”
有人想这样写:
try (@Cleanup BufferedReader br = new BufferedReader(...)) { ... }
这不推荐,也不必要。Lombok 的 @Cleanup 在 try 块里生成的是普通变量 + finally close,不如原生 try-with-resources 语义清晰、异常处理健壮。而且 Lombok 生成的代码不可见,调试和审查时反而增加理解成本。
- 能用
try-with-resources就坚决用它 - 只有当资源类确实不满足
AutoCloseable,又不想手动写finally,才用@Cleanup - 使用前确认目标方法(如
close())是幂等的、线程安全的、且不会抛出未检查异常(否则可能破坏业务逻辑)
小提醒:Lombok 配置与兼容性
启用 @Cleanup 不需要额外配置,但需确保:
- Lombok 已正确安装(IDE 插件 + 项目依赖)
- Maven/Gradle 中 Lombok 版本 ≥ 1.16.20(早期版本对
@Cleanup支持不完整) - 如果资源类 close 方法名不是
close(),必须显式指定:@Cleanup("shutdown") Server server = ...
另外,@Cleanup 对局部变量生效,不支持字段或参数 —— 它本质是“在变量作用域出口插一句 close 调用”,所以只适用于方法内声明的变量。
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南










