好用的 Lombok 注解
配置
Lombok 的配置非常簡(jiǎn)單。Lombok 提供了 Maven 和 Gradle 的依賴項(xiàng),你可以根據(jù)需要選擇使用。
(1) Maven:
在你的pom.xml中添加以下依賴:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.18.34</version>
<scope>provided</scope>
</dependency>
(2) Gradle:
在你的build.gradle中添加以下依賴:
dependencies {
compileOnly 'org.projectlombok:lombok:1.18.34'
annotationProcessor 'org.projectlombok:lombok:1.18.34'
}
@Builder
建造者模式是開(kāi)發(fā)中非常常見(jiàn)的設(shè)計(jì)模式。它允許我們逐步構(gòu)建對(duì)象,并對(duì)其配置進(jìn)行細(xì)粒度控制,同時(shí)保持構(gòu)造代碼的簡(jiǎn)潔。
在沒(méi)有 Lombok 的情況下,代碼通常如下所示:
public class Order {
privatefinal String customerName;
privatefinal Address deliveryAddress;
private Order(String customerName, Address deliveryAddress) {
this.customerName = customerName;
this.deliveryAddress = deliveryAddress;
}
public static OrderBuilder builder() {
returnnew OrderBuilder();
}
publicstaticclass OrderBuilder {
private String customerName;
private Address deliveryAddress;
OrderBuilder(){};
public Builder customerName(String name) {
this.customerName = name;
returnthis;
}
public Builder deliveryAddress(Address address) {
this.deliveryAddress = address;
returnthis;
}
public Order build() {
returnnew Order(customerName, deliveryAddress);
}
}
}
使用 Lombok 的實(shí)現(xiàn):
@Builder
public class Order {
private final String customerName;
private final Address deliveryAddress;
}
這是一個(gè)非常簡(jiǎn)單的例子,但實(shí)際上還有很多其他注解可以定制建造者設(shè)計(jì)模式。我將在下一篇文章中介紹它們。
@Data
這個(gè)注解將一些常見(jiàn)的 Lombok 注解結(jié)合在一起:
- @ToString
- @Getter
- @Setter
- @EqualsAndHashCode
- @RequiredArgsConstructor
沒(méi)有 Lombok 的示例:
public class UserInfo {
private String username;
private String password;
private String email;
public UserInfo(String username, String password, String email) {
this.username = username;
this.password = password;
this.email = email;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public String getEmail() {
return email;
}
public void setEmail(String email) {
this.email = email;
}
@Override
public boolean equals(Object o) {
// 一些實(shí)現(xiàn)
}
@Override
public int hashCode() {
return Objects.hash(username, password, email);
}
@Override
public String toString() {
return"UserInfo(" +
"username='" + username + '\'' +
", password='" + password + '\'' +
", email='" + email + '\'' +
')';
}
}
使用 Lombok 的實(shí)現(xiàn):
@Data
public class UserInfo {
private String username;
private String password;
private String email;
}
@Value
如果我們希望所有字段默認(rèn)都是私有的且不可變的(沒(méi)有 setter 方法),可以使用@Value 注解,如下所示:
@Value
public class UserInfo {
private String username;
private String password;
private String email;
}
@NonNull
這個(gè)注解用于為任何方法或構(gòu)造函數(shù)參數(shù)生成空值檢查語(yǔ)句。
public void setEmail(@NonNull String email) {
this.email = email;
}