官方文档
官网文档 ,只有几个注解,但是功能很是强大。
在idea中使用Lombok,可以使用插件,在插件处输入Lombok就可以安装了,比较简单。
一般是使用Maven导入lombok.jar
1
2
3
4
5
6
7
<!-- https://mvnrepository.com/artifact/org.projectlombok/lombok -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.2</version>
<scope>provided</scope>
</dependency>
val / var
val注解变量申明是final类型
var注解变量是非final类型
注意:只能用于方法内
@cleanup
使用该注解能够自动释放io资源
1
2
3
4
5
try{
OutputStream out = new FileOutputStream(args[1]);
} finally{
out.close();
}
java 1.7 之后,可以直接try(),会自动关闭。
1
2
3
try(OutputStream out = new FileOutputStream(args[1])){
}
@Getter/@Setter
使用在类和属性上,用在类上时,会对所有的非静态(non-static)属性生成相应的Getter/Setter方法。注解在属性上时,对该属性生成Getter/Setter方法。可以指定Getter/Setter方法的访问级别。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public class AllInformation implements Serializable {
@Getter
@Setter
private int count;
@Getter
@Setter
private int start;
@Getter
@Setter
private int total;
@Getter
@Setter
private ArrayList<Subjects> subjects;
}
增加@Getter/@Setter后,自动生成相应的方法。
@EqualsAndHashCode
默认情况下,对所有非瞬态(non-transient)和非静态(non-static)字段生成equals和hashCode方法,也可以指定具体使用哪些属性
1
2
3
4
5
6
7
8
@EqualsAndHashCode
public class AllInformation implements Serializable {
private int count;
private int start;
private int total;
private ArrayList<Subjects> subjects;
}
@ToString
生成toString方法,默认情况下,会输出类名、所有属性,属性按照顺序输出,以逗号分割。
1
2
3
4
5
6
7
8
@ToString
public class AllInformation implements Serializable {
private int count;
private int start;
private int total;
private ArrayList<Subjects> subjects;
}
@NoArgsConstructor,@RequiredArgsConstructor and @AllArgsContructor
无参构造器、部分参数构造器、全参构造器。当我们需要重载多个构造器的时候,Lombok就没办法了,这个时候我们就只能自己重载这些构造器。
@Data
@ToString,@EqualsAndHashCode,所有属性的@Getter,所有non-final属性的@Setter和@RequiredArgsConstructor的组合。通常情况,使用这个注解就OK了
1
2
3
4
5
6
7
8
@Data
public class AllInformation implements Serializable {
private int count;
private int start;
private int total;
private ArrayList<Subjects> subjects;
}
@Accessors(chain = true)
使用链式结构 没有使用注解的代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public Student setName(String name) {
this.name = name;
return this;
}
public int getAge() {
return age;
}
public Student setAge(int age) {
return this;
}
}
使用注解的代码:
1
2
3
4
5
6
7
@Accessors(chain = true)
@Data
@NoArgsConstructor(staticName = "of")
public class Student {
private String name;
private int age;
}
调用:
1
Student student = Student.of().setName("wsk").setAge(12);
其实是使用了该注解后,set方法返回了该对象。
@RequiredArgsConstructor和@NonNull:
静态构造方法和必传参数的构造方法,
1
2
3
4
5
6
7
8
9
@Accessors(chain = true)
@Setter
@Getter
@RequiredArgsConstructor(staticName = "ofName")//staticName中可以任意编写
public class Student {
@NonNull
private String name;//该元素在构造函数中必须输入
private int age;
}
测试代码:
1
Student student = Student.ofName("WSK");
@Builder
使用builder,构建 建造者模式
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
public class Student {
private String name;
private int age;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public static Builder builder(){
return new Builder();
}
public static class Builder{
private String name;
private int age;
public Builder name(String name){
this.name = name;
return this;
}
public Builder age(int age){
this.age = age;
return this;
}
public Student build(){
Student student = new Student();
student.setAge(age);
student.setName(name);
return student;
}
}
}
调用方式:
1
Student student = Student.builder().name("zs").age(24).build();
使用@Builder
1
2
3
4
5
@Builder
public class Student {
private String name;
private int age;
}
调用方式同上。
以下为不常用的
@Value
Immutable classes made very easy.
@value是@data的不可变对象 (不可变对象的用处和创建:https://my.oschina.net/jasonultimate/blog/166810)
所有字段都是私有的,默认情况下是final的,并且不会生成setter。默认情况下,类本身也是final的,因为不可变性不能强制转化为子类。与@data一样,有用toString()、equals()和hashCode()方法也是生成的,每个字段都有一个getter方法,并且一个覆盖每个参数的构造器也会生成。
@SneakyThrows
To boldly throw checked exceptions where no one has thrown them before!
把checked异常转化为unchecked异常,好处是不用再往上层方法抛出了,美其名曰暗埋异常
@SneakyThrows(NullPointerException.class)
@Synchronized
synchronized done right: Don’t expose your locks.
类似于Synchronized 关键字 但是可以隐藏同步锁
@Getter(lazy = true)
懒加载
如果getter方法计算值需要大量CPU,或者值占用大量内存,第一次调用这个getter,它将一次计算一个值,然后从那时开始缓存它
@Log
Captain’s Log, stardate 24435.7: “What was that line again?”
可以生成各种log对象,方便多了