@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更新允许,或者我们找到了一种方法,我们将修复它。

您仍然需要处理清理方法可以生成的任何异常!