java中cleanup的使用_【Lombok注解】@Cleanup 自动资源管理:安全无困扰地调用close方法...
引言
你可以使用@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来进行调用。
使用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);
}
}
}
普通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] (default: not set) 默认不进行设置,配置后Lombok将会把使用@Cleanup的类标记为错误或者警告。
小提示
在finally块中,仅在给定资源不为null时才调用清除方法。 但是,如果在代码上使用delombok,则会插入lombok.Lombok.preventNullAnalysis(Object o)并调用,以防止在静态代码分析可能确定不需要进行空检查时发出警告。 在类路径上使用lombok.jar进行编译会删除该方法调用,因此不存在运行时依赖性。
当作用域中的代码块抛出异常后,清除方法也抛出异常时,原异常将被清除方法抛出的异常所覆盖进而被隐藏。所以不可过度依赖这个特性。如果可以的话,Lombok想要成的代码时当主体代码块抛出异常时,清除方法抛出的异常就被静默吞噬(但是当主体代码以其他方式退出时则不进行吞噬)。Lombok的作者目前不知道该如何实现这个方法,但如果Java后面的更新允许,我们将对此进行修复。
你依旧需要处理清除方法抛出的一切异常。
java中cleanup的使用_【Lombok注解】@Cleanup 自动资源管理:安全无困扰地调用close方法...相关推荐
- java中next的用法_关于java iterator的next()方法的用法
UYOU next()是java迭代器类(Iterator)的方法,获得当前游标指向的下一个元素,详细说明和应用如下:1.迭代器(Iterator)介绍 迭代器是一种设计模式,它是一个对象,它可以遍历 ...
- Java黑皮书课后题第7章:7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值。编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字
7.15(消除重复)使用下面的方法头编写方法,消除数组中重复出现的值.编写一个测试程序,读取10个数,调用该方法,并显示以一个空格分隔的不同数字 题目 题目描述与运行示例 破题 代码 21.11.11 ...
- 谈谈对java中分层的理解_让我们谈谈网页设计中的卡片设计
谈谈对java中分层的理解 "I want a card", this is the first demand point that the customer said in th ...
- java中函数是什么_[一] java8 函数式编程入门 什么是函数式编程 函数接口概念 流和收集器基本概念...
本文是针对于java8引入函数式编程概念以及stream流相关的一些简单介绍 什么是函数式编程? java程序员第一反应可能会理解成类的成员方法一类的东西 此处并不是这个含义,更接近是数学上的函数 看 ...
- java中静态方法可以被继承_关于java:静态方法中的继承
为什么下面的代码会打印"MAIN"? public class Main { public static void method() { System.out.println(&q ...
- java中execution的作用_一文初步了解Java虚拟机
大家都知道,Java中JVM的重要性,学习了JVM你对Java的运行机制.编译过程和如何对Java程序进行调优相信都会有一个很好的认知. 什么是JVM? JVM(Java Virtual Machin ...
- java中打开文件显示_从java程序中打开任何文件
在 java中打开文件似乎有点棘手 – 对于.txt文件,必须将File对象与Scanner或BufferedReader对象结合使用 – 对于图像IO,必须使用 ImageIcon类 – 如果要打开 ...
- java中各种vo举例_了解JAVA中的POJO,Entity,PO,VO,DTO,DM包括代码举例展示
标签: 首先是从概念上来说 POJO,全称Plain Ordinary Java Object,我理解为极其单纯的Java对象 一般只有属性字段,无参构造以及get和set方法,也是指那些没有从任何类 ...
- java中xml怎样配置_如何通过XML方式配置并实现Mybatis
idea中创建一个maven项目 在pom文件中导入下面的依赖 org.mybatis mybatis 3.4.6 mysql mysql-connector-java 8.0.18 log4j lo ...
- java中字符串的创建_【转载】 Java中String类型的两种创建方式
本文转载自 https://www.cnblogs.com/fguozhu/articles/2661055.html Java中String是一个特殊的包装类数据有两种创建形式: String s ...
最新文章
- mysql实现sass_使用sass绘制三角形
- EntityFramework SaveChange()方法不能更新的问题
- 常见电子元件实物照片
- vs2010 unresolved external symbol error
- java全面的知识体系结构总结
- 网页 html 全图片排版,HTML5-网页排版划分
- win7设置自动开机时间_电脑可以设置自动开机时间,您知道吗?
- 双城生活,一种相对无奈且幸福的选择
- ArcGIS实验教程——实验十六:空间数据查询
- vc中关于 directx的配置,和dxsdk_extras(directshow)
- 在java中jvm目录_JVM具体在哪个文件夹下的
- mysql 联合主键_深入理解Mysql索引底层数据结构与算法,背后的故事
- 前端基础:学习 ES6 新特性
- 计算机编码中进制的区别,计算机中的进制和编码(转载)
- flash实用工具类+开源包收藏
- 需求分析说明书SRS
- [原创]集成了网络/加密解密/大数运算/位运算等功能的dll
- 助力低碳出行 | 基于ACM32 MCU的电动滑板车方案
- kettle案例21-将字段值设置为常量
- 家用 NAS 服务器(1)| 配置选择及准备