@Cleanup
自动资源管理:安全调用 close()
方法,无需烦恼。
概述
你可以使用 @Cleanup
注解来确保在代码执行路径退出当前作用域之前,给定的资源被自动清理。你可以通过使用 @Cleanup
注解来注释任何局部变量声明,就像这样
@Cleanup InputStream in = new FileInputStream("some/file");
结果是,在你所在作用域的末尾,in.close()
会被调用。此调用通过 try/finally 结构保证运行。请看下面的示例以了解其工作原理。
如果你想清理的对象类型没有 close()
方法,而是其他无参数方法,你可以像这样指定此方法的名称
@Cleanup("dispose") org.eclipse.swt.widgets.CoolBar bar = new CoolBar(parent, 0);
默认情况下,清理方法被假定为 close()
。 接受 1 个或多个参数的清理方法不能通过 @Cleanup
调用。
使用 Lombok
import lombok.Cleanup;
|
原生 Java
import java.io.*;
|
支持的配置键
-
lombok.cleanup.flagUsage
= [warning
|error
] (default: not set) 如果配置了,Lombok 将标记任何
@Cleanup
的使用为警告或错误。小字说明
在 finally 块中,仅当给定资源不为 null
时才调用清理方法。但是,如果在代码上使用 delombok
,则会插入对 lombok.Lombok.preventNullAnalysis(Object o)
的调用,以防止在静态代码分析可以确定不需要空检查时发出警告。使用类路径上的 lombok.jar
进行编译会删除该方法调用,因此没有运行时依赖项。
如果你的代码抛出异常,并且随后触发的清理方法调用也抛出异常,那么原始异常将被清理调用抛出的异常隐藏。 你*不应该*依赖这个“功能”。 最好是,lombok 希望生成代码,以便如果主体抛出异常,则 close 调用抛出的任何异常都会被静默吞噬(但如果主体以任何其他方式退出,则 close 调用抛出的异常将不会被吞噬)。 lombok 的作者目前还不知道实现此方案的可行方法,但如果 java 更新允许,或者我们找到方法,我们将修复它。
你仍然需要处理清理方法可能生成的任何异常!