@Cleanup - codercuixin/lombok-translate GitHub Wiki
@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()
。 不能通过@Cleanup
调用带有1个或多个参数的清理方法。
With Lombok
import lombok.Cleanup;
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
@Cleanup InputStream in = new FileInputStream(args[0]);
@Cleanup OutputStream out = new FileOutputStream(args[1]);
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
}
}
Vanilla Java
import java.io.*;
public class CleanupExample {
public static void main(String[] args) throws IOException {
InputStream in = new FileInputStream(args[0]);
try {
OutputStream out = new FileOutputStream(args[1]);
try {
byte[] b = new byte[10000];
while (true) {
int r = in.read(b);
if (r == -1) break;
out.write(b, 0, r);
}
} finally {
if (out != null) {
out.close();
}
}
} finally {
if (in != null) {
in.close();
}
}
}
}
支持的配置键
lombok.cleanup.flagUsage
= [warning
| error
] (默认值:未设置)
如果已配置,Lombok会将@Cleanup
的任何用法标记为警告或错误。
Small print
在finally
块中,仅在给定资源不为null
时才调用cleanup
方法。但是,如果在代码上使用delombok
,则会插入对lombok.Lombok.preventNullAnalysis(Object o)
的调用,以防止在静态代码分析可能确定不需要进行空检查时发出警告。在类路径上使用lombok.jar进行编译会删除该方法调用,因此不存在运行时依赖性。
如果你的代码抛出异常,并且随后触发的cleanup方法调用也会抛出异常,则cleanup方法调用抛出的异常将隐藏原始异常。你不应该依赖这个'功能'。最好是,lombok可以生成这样的生成代码--如果主体抛出了异常,那么close调用抛出的任何异常都会被静默吞噬(但如果主体以任何其他方式退出,则close调用的异常将不会吞咽)。 lombok的作者目前不知道实现这个方案的可行方法,但是如果java更新允许,或者我们找到了一种方法,我们将修复它。
您仍然需要处理清理方法可以生成的任何异常!