Lombok学习笔记

Posted by AceKei on September 15, 2017

官方文档

官网文档 ,只有几个注解,但是功能很是强大。

在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后,自动生成相应的方法。
image

@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;

}

image

@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;

}

image

@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;

}

image

@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方法返回了该对象。
image

@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对象,方便多了