lombok在IntelliJ IDEA下的使用

lombok是一款可以精减java代码、提升开发人员生产效率的辅助工具,利用注解在编译期自动生成setter/getter/toString()/constructor之类的代码。代码越少,意味着出bug的可能性越低。

官网地址:https://projectlombok.org/ 首页有一段几分钟的演示视频,看完就明白是怎么回事了。

先来二段对比代码:

这是用lombok后的java代码:

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
import lombok.*;
import lombok.extern.slf4j.Slf4j;
import java.io.ByteArrayInputStream;
import java.io.*;
import java.util.ArrayList;
 
@Data
@Slf4j
@AllArgsConstructor
public class Something {
 
    private String name;
    private final String country;
    private final Object lockObj = new Object();
 
    public void sayHello(@NonNull String target) {
        String content = String.format("hello,%s", target);
        System.out.println(content);
        log.info(content);
    }
 
    public void addBalabala() {
        val list = new ArrayList<String>();
        list.add("haha");
        System.out.println(list.size());
    }
 
    @SneakyThrows(IOException.class)
    public void closeBalabala() {
        @Cleanup InputStream is = new ByteArrayInputStream("hello world".getBytes());
        System.out.println(is.available());
    }
 
    @Synchronized("lockObj")
    public void lockMethod() {
        System.out.println("test lock method");
    }
}

等效于下面这段java代码:

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
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
import java.beans.ConstructorProperties;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Collections;
import lombok.NonNull;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
 
public class Something {
    private static final Logger log = LoggerFactory.getLogger(Something.class);
    private String name;
    private final String country;
    private final Object lockObj = new Object();
 
    public void sayHello(@NonNull String target) {
        if(target == null) {
            throw new NullPointerException("target");
        else {
            String content = String.format("hello,%s"new Object[]{target});
            System.out.println(content);
            log.info(content);
        }
    }
 
    public void addBalabala() {
        ArrayList list = new ArrayList();
        list.add("haha");
        System.out.println(list.size());
    }
 
    public void closeBalabala() {
        try {
            ByteArrayInputStream $ex = new ByteArrayInputStream("hello world".getBytes());
 
            try {
                System.out.println($ex.available());
            finally {
                if(Collections.singletonList($ex).get(0) != null) {
                    $ex.close();
                }
 
            }
 
        catch (IOException var6) {
            throw var6;
        }
    }
 
    public void lockMethod() {
        Object var1 = this.lockObj;
        synchronized(this.lockObj) {
            System.out.println("test lock method");
        }
    }
 
    public String getName() {
        return this.name;
    }
 
    public String getCountry() {
        return this.country;
    }
 
    public Object getLockObj() {
        return this.lockObj;
    }
 
    public void setName(String name) {
        this.name = name;
    }
 
    public boolean equals(Object o) {
        if(o == this) {
            return true;
        else if(!(o instanceof Something)) {
            return false;
        else {
            Something other = (Something)o;
            if(!other.canEqual(this)) {
                return false;
            else {
                label47: {
                    String this$name = this.getName();
                    String other$name = other.getName();
                    if(this$name == null) {
                        if(other$name == null) {
                            break label47;
                        }
                    else if(this$name.equals(other$name)) {
                        break label47;
                    }
 
                    return false;
                }
 
                String this$country = this.getCountry();
                String other$country = other.getCountry();
                if(this$country == null) {
                    if(other$country != null) {
                        return false;
                    }
                else if(!this$country.equals(other$country)) {
                    return false;
                }
 
                Object this$lockObj = this.getLockObj();
                Object other$lockObj = other.getLockObj();
                if(this$lockObj == null) {
                    if(other$lockObj != null) {
                        return false;
                    }
                else if(!this$lockObj.equals(other$lockObj)) {
                    return false;
                }
 
                return true;
            }
        }
    }
 
    protected boolean canEqual(Object other) {
        return other instanceof Something;
    }
 
    public int hashCode() {
        boolean PRIME = true;
        byte result = 1;
        String $name = this.getName();
        int result1 = result * 59 + ($name == null?0:$name.hashCode());
        String $country = this.getCountry();
        result1 = result1 * 59 + ($country == null?0:$country.hashCode());
        Object $lockObj = this.getLockObj();
        result1 = result1 * 59 + ($lockObj == null?0:$lockObj.hashCode());
        return result1;
    }
 
    public String toString() {
        return "Something(name=" this.getName() + ", country=" this.getCountry() + ", lockObj=" this.getLockObj() + ")";
    }
 
    @ConstructorProperties({"name""country"})
    public Something(String name, String country) {
        this.name = name;
        this.country = country;
    }
}

大概减少了2/3的代码,各种注解的详细用法,请参考:https://projectlombok.org/features/index.html

IDEA下使用时,可以通过插件的形式安装,插件下载地址:https://github.com/mplushnikov/lombok-intellij-plugin/releases 

然后

Plugins -> Install plugin from disk... 选择下载的zip包安装,重启idea即可。

另外,还有一个关键设置:
lombok在IntelliJ IDEA下的使用

为了让设置生效,建议再重启一次idea,然后就可以开心的编码了,可以ide里可以直接看到生成的方法:(下图中打红圈的都是自动生成的)

lombok在IntelliJ IDEA下的使用  


作者:菩提树下的杨过
出处:http://yjmyzz.cnblogs.com