Lombok的使用
Lombok是什么?
Lombok是一个很牛批的插件(本质是个Java库),项目里一旦引入了Lombok神器之后,只要程序中使用相关注解,那么你项目中所有诸如:对象的构造函数、 equals()
方法,属性的 get()/set()
方法等等,这些没有技术含量的代码统统都不用写了,Lombok帮你搞定一切,全部帮你自动生成!
怎样使用Lombok?
1、IDEA下载插件
2、引入依赖
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.6</version>
</dependency>
常用的注解
1、@Data
作用于类上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor
,当类的属性中没有必须属性(即使用final
关键字声明的属性),那么会生成一个无参构造器。否则生成一个由所有被final
关键字(或者将标记为@NoNull的属性生成一个构造器 )声明属性的有参构造函数。
- 没有
final
声明的属性
@Data
public class Student {
private String id;
private String name;
private Date birthday;
}
====================================
//...
Student student = new Student();
student.setId("20200202");
student.setName("莫提");
student.setBirthday(new Date());
System.out.println(student);
//...
- 有
final
声明的属性
@Data
public class Student {
private String id;
private final String name;
private Date birthday;
}
====================================
//...
Student student = new Student("莫提");
student.setId("20200202");
student.setBirthday(new Date());
System.out.println(student);
//...
2、@Getter和@Setter
为属性生成对应的get()
和set()
,声明在类上的时候为所有属性生成对应方法,声明在某个属性的时候,为这个属性生成对应方法。
@Getter
@Setter
public class Student {
private String id;
private String name;
private Date birthday;
}
====================================
//...
Student student = new Student();
student.setId("20200202");
student.setName("莫提");
student.setBirthday(new Date());
//...
3、@Builder
对象的创建即可使用 链式表达 的方式一行代码完成, 看到这里,如果你学过设计模式中的 “建造者模式” 的话,一定能猜到 @Builder
注解就是一个典型的“建造者模式”的实现案例!
@Builder public class Student { private String id; private String name; private Date birthday; } ==================================== //... Student student = Student.builder().id("1").name("莫提").birthday(new Date()).build(); //...
3、构造函数注解
- @AllArgsConstructor(全参构造)
- @NoArgsConstructor (空参构造)
- @RequiredArgsConstructor (部分参数构造,参数使用
final
关键字声明)
注意这里 @RequiredArgsConstructor 和 @NoArgsConstructor 不能同时出现,因为当一个属性被final关键字声明后,创建对象的时候一定要给这个属性传参,所以可以理解这两个注解是冲突的。
- 空参构造和全参构造
@NoArgsConstructor
@AllArgsConstructor
public class Student {
private String id;
private String name;
private Date birthday;
}
====================================
//...
Student student1 = new Student();
Student student2 = new Student("1","moti",new Date());
//...
- 部分参数构造和全参构造
@RequiredArgsConstructor
@AllArgsConstructor
public class Student {
private final String id;
private String name;
private Date birthday;
}
====================================
//...
Student student1 = new Student("1");
Student student2 = new Student("1","moti",new Date());
//...
4、@NonNull
Lombok的 @NonNull
注解可以自动帮我们避免空指针判断。主要作用于成员变量和参数中,标识不能为空,否则抛出空指针异常。
public static void testNonNull(@NonNull String input){
System.out.println(input);
}
public static void main(String[] args) {
testNonNull(null);
}
运行main方法之后,控制台报错。
5、@Cleanup
自动关闭资源,针对实现了java.io.Closeable接口的对象有效,如:典型的IO流对象,也就是不需要在finally子句里面手动关闭资源了。
public void testCleanup() {
@Cleanup BufferedReader br = null;
@Cleanup FileReader fileReader = null;
try {
fileReader = new FileReader("hehe.txt");
br = new BufferedReader(fileReader);
//中间一些流操作
} catch (FileNotFoundException e) {
e.printStackTrace();
}
}
6、@SneakyThrows
可以对受检异常进行捕捉并抛出
对上面的程序进行简化
@SneakyThrows
public void testSneakyThrows() {
@Cleanup BufferedReader br = null;
@Cleanup FileReader fileReader = null;
fileReader = new FileReader("hehe.txt");
br = new BufferedReader(fileReader);
//中间一些流操作
}
注解表
注解名 | 作用 |
@Setter | 生成setter方法,final变量不包含 |
@Getter | 生成getter方法,final变量不包含 |
@NoArgsConstructor | 生成空参构造 |
@AllArgsConstructor | 生成全部参数构造 |
@RequiredArgsConstructor | 将标记为@NoNull的属性生成一个构造器 |
@ToString | 生成所有属性的toString()方法 |
@EqualsAndHashCode | 生成equals()方法和hashCode方法 |
@Data(常用) | @Data直接修饰POJO or beans, getter所有的变量,setter所有不为final的变量。如果你不需要默认的生成方式,直接填写你需要的annotation的就可以了。默认生成的所有的annotation都是public的,如果需要不同权限修饰符可以使用AccessLevel.NONE选项。当然@Data 也可以使用staticConstructor选项生成一个静态方法。 =@Setter+@Getter+@EqualsAndHashCode+@NoArgsConstructor |
@Builder | 构造Builder模式的结构。通过内部类Builder()进行构建对象。 |
@Value | 与@Data相对应的@Value, 两个annotation的主要区别就是如果变量不加@NonFinal ,@Value会给所有的弄成final的。当然如果是final的话,就没有set方法了。 |
@Synchronized | 同步方法 |
@Cleanup | 自动调用close方法关闭资源 |
@SneakyThrows | 可以对受检异常进行捕捉并抛出 |