Lombok 使用教程-@Cleanup | 如何优雅的自动管理资源,安全地调用你的close()方法。

作者简介:大家好,我是smart哥,前中兴通讯、美团架构师,现某互联网公司CTO

联系qq:184480602,加我进群,大家一起学习,一起进步,一起对抗互联网寒冬

学习必须往深处挖,挖的越深,基础越扎实!

阶段1、深入多线程

阶段2、深入多线程设计模式

阶段3、深入juc源码解析


阶段4、深入jdk其余源码解析


阶段5、深入jvm源码解析

码哥源码部分

码哥讲源码-原理源码篇【2024年最新大厂关于线程池使用的场景题】

码哥讲源码【炸雷啦!炸雷啦!黄光头他终于跑路啦!】

码哥讲源码-【jvm课程前置知识及c/c++调试环境搭建】

​​​​​​码哥讲源码-原理源码篇【揭秘join方法的唤醒本质上决定于jvm的底层析构函数】

码哥源码-原理源码篇【Doug Lea为什么要将成员变量赋值给局部变量后再操作?】

码哥讲源码【你水不是你的错,但是你胡说八道就是你不对了!】

码哥讲源码【谁再说Spring不支持多线程事务,你给我抽他!】

终结B站没人能讲清楚红黑树的历史,不服等你来踢馆!

打脸系列【020-3小时讲解MESI协议和volatile之间的关系,那些将x86下的验证结果当作最终结果的水货们请闭嘴】

一、简介

你可以使用@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调用。

二、示例比较

1. 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);
        }
      }
    }

2. 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的任何使用标记为warningerror

四、附属说明

finally块中,仅当给定资源不为null时才调用cleanup方法。但是,如果在代码上使用delombok,则会插入对lombok.Lombok.preventNullAnalysis(Object o)的调用,以防止在静态代码分析确定不需要空检查时发出警告。在类路径上使用lombok.jar进行编译将删除该方法调用,因此不存在运行时依赖关系。

如果你的代码抛出了一个异常,而随后触发的清理方法调用也抛出了一个异常,那么原来的异常就会被清理调用抛出的异常所隐藏。你不应该依赖这个 “特性”。最好的情况是,lombok希望生成的代码是,如果主体抛出了一个异常,任何由关闭调用抛出的异常都会被默默地吞掉(但是如果主体以任何其他方式退出,关闭调用的异常将不会被吞掉)。lombok的作者目前还不知道有什么可行的方法来实现这个方案,但是如果java的更新允许,或者我们找到了方法,将会修复它。

你仍然需要处理清理方法可能产生的任何异常。

参考文献

【1】@Cleanup Automatic resource management: Call your close() methods safely with no hassle.

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值