六、其他重要的Lombok注解
@Cleanup注解 与 @SneakyThrows注解
@Cleanup注解
@Cleanup注解可以生成对资源进行关闭的代码,无须手动通过try-catch-finally代码块判断并关闭所有的资源
在test包下新建CleanupAnnotationTest,测试@Cleanup注解
public class CleanupAnnotationTest { public void copyFile(String in, String out) throws Exception{ @Cleanup FileInputStream fileInputStream = new FileInputStream(in); @Cleanup FileOutputStream fileOutputStream = new FileOutputStream(out); int r; while ((r = fileInputStream.read()) != -1){ fileOutputStream.write(r); } } public static void main(String[] args) { } } 复制代码
@Cleanup注解使用在需要关闭资源的变量名前。执行main方法,查看target目录下生成的class文件
这里自动生成了try-catch-finally代码块对资源进行了关闭操作,可以防止资源未关闭导致的性能问题
@SneakyThrows
@SneakyThrows方法只能作用在方法上,@SneakyThrows注解代替程序中的手动抛出异常代码既对受检异常进行捕捉并抛出
新建SneakyThrowsAnnotationTest测试类,将CleanupAnnotationTest的copyFile代码拷贝至SneakyThrowsAnnotationTest类下
public class SneakyThrowsAnnotationTest { @Test @SneakyThrows public void copyFile(String in, String out){ @Cleanup FileInputStream fileInputStream = new FileInputStream(in); @Cleanup FileOutputStream fileOutputStream = new FileOutputStream(out); int r; while ((r = fileInputStream.read()) != -1){ fileOutputStream.write(r); } } } 复制代码
添加了@SneakyThrows注解后,无须在方法上抛出异常,程序也不会报错
根据编译后的class文件可以确定,SneakyThrowsAnnotationTest类中有两层try-catch,最外层就是方法上添加了@SneakyThrows注解生成的异常处理代码。内层try-catch-finally则是资源关闭的代码
@Accessors注解
@Accessor注解是用于配置getter/setter方法生成的结果;Accessor是存取器、访问器的意思。@Accessor注解包含了三个属性分别是fluent、chain和prefix
chain 属性
在entity包下新建Porsche实体类,chain 属性可以设置为true或者false
@Data @Accessors(chain = true) public class Porsche { private Integer id; private String name; private Double price; private Integer stock; } 复制代码
运行maven的complie命令,查看target目录下的编译后的class文件
@Accessor(chain=true)注解会在@Data注解生成的setter方法基础上做修改,将setter方法的返回值由void修改为实体类类型,因此可以执行链式操作
在test包下新建PorscheTest
public class PorscheTest { @Test public void testAccessorAnnotationChain(){ Porsche prosche = new Porsche(); prosche.setId(1).setName("Taycan").setPrice(880000.00).setStock(110); System.out.println(prosche); } } 复制代码
设置对象属性时,仅仅一行代码就可以搞定;执行测试方法
fluent 属性
在entity包下新建Tesla实体类,fluent属性可以设置true或者false
@Data @Accessors(fluent = true) public class Tesla { private Integer id; private String vehicleName; private String vehicleType; private String vehiclePrice; private String factory; } 复制代码
运行maven的compile编译命令,查看target目录下编译后的Tesla实体类的class文件
@Accessor注解fluent=true会在chain=true的基础上将getter/setter的方法名改为属性名
在test包下新增TeslaTest测试类
public class TeslaTest { @Test public void testAccessorAnnotationFluent(){ Tesla tesla = new Tesla(); tesla.id(1).vehicleName("Model S").vehicleType("轿跑").vehiclePrice("880000").factory("上海超级工厂"); System.out.println(tesla); } } 复制代码
相比chain=true属性的设置,fluent=true将getter/setter方法名进行了统一,调用属性名的方法时如果传参就相当于调用setter方法,如果不传参就相当于调用getter方法;
执行测试方法
prefix属性
prefix属性可以将指定的前缀表示去除,在entity包新建Jaugar实体类
@Data @Accessors(prefix = "j") public class Jaugar { private Integer jId; private String jName; private Double jPrice; } 复制代码
点击maven的compile命令,查看target目录下的Jaguar class文件
@Accessors(prefix = "j")注解在@Data生成的getter/setter方法的基础上,将指定的前缀去除