前言
前陣子閑逛的時候,留意到了Lombok這個Java第三方庫,後來親自試用了一下,還真有一種相見恨晚的感覺,對于部落客這樣的懶人來說,這簡直是太實用了。這不趁周末,趕緊把好東西寫出來分享一下。
Lombok
引述官網介紹:
Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again. Early access to future java features such as val, and much more.
Lombok是一個java庫,它可以自動插入您的編輯器和建構工具,為您的java提供幫助。再也不要寫其他的getter或equals方法了。盡早通路諸如val之類的未來java特性。
Tip:單人項目開發中使用極佳,或多人協作開發中強制要求使用相同環境。因為需要配置的原因,但目前編輯器和編譯器還沒有那麼智能和友善o(╥﹏╥)o...
效果
- 未使用Lombok前的POJO大概是這樣的(為了友善,下面把Entity、DTO、VO之類的都統稱為POJO)
public class User {
private Integer id;
private String nickname;
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getNickname() {
return nickname;
}
public void setNickname(String nickname) {
this.nickname = nickname;
}
@Override
public String toString() {
return "User{" +
"nickname='" + nickname + '\'' +
", id=" + id +
'}';
}
}

simple entity
- 使用了Lombok之後的POJO大概是這樣的
@Data
public class User {
private Integer id;
private String nickname;
}
use lombok
搭建
- 添加依賴
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<optional>true</optional>
</dependency>
- 下載下傳插件(IDEA)
下載下傳Lombok Plugin插件
- 配置支援
開啟支援
PS:IDEA中的Spring Initializr已內建Lombok,建立Spring Boot項目的時候勾選Lombok選擇即可
Spring Initializr -> Lombok
說明圖
下面先來看下Lombok中幾個主要常用注解介紹說明圖:
Lombok常用注解說明圖
具體說明
-
(常用)@Data
在類上使用此注解,相當于為目前類的非final字段添加了getter()、setter()、toString()、equals()以及hashCode()方法,同時這也是一個多功能組合注解,組合了下面的@ToString,@EqualsAndHashCode,@Getter,@Setter和@RequiredArgsConstructor這五個注解
@Data
-
@Builder
此注解需用在類上。Lombok底層通過構造者模式來轉換目前類,在項目實際使用的時候,我們可以以參數鍊的形式組裝該對象,或者是以全參構造器的形式來new一個目前對象。當組合使用@Data注解的時候(一般來說是沒必要的),Lombok也不會再為目前對象生成getter()、setter()方法。使用鍊式構造一個對象會顯得更加優雅,是以這個注解也是非常實用的
@Builder
-
@Builder.Default
此注解用在字段上。目前類使用了@Builder進行構造且某些字段含有預設值的情況下,需要為這些字段添加此注解,不加此注解預設值在構造的時候是不生效的,需要進行手動設值
@Builder.Default
-
@Slf4j
private final Logger logger = LoggerFactory.getLogger(getClass());
上面這段代碼很熟悉吧。為目前類添加@Slf4j後,我們就可以舍棄這段代碼了,是不是簡潔多了
@Slf4j
-
val, var
val将局部變量申明為final類型,而var則用于修飾變量但不是final類型
val noLombok = new HashSet<String>();
var noLombok2=new ArrayList<Integer>();
////=> 以上這段代碼相當于:
final Set<String> useLombok = new HashSet<>();
List<Integer> useLombok2=new ArrayList<>();
-
@NonNull
該注解能夠為方法,或構造函數的參數提供非空檢查
public void notNull(@NonNull String arg) {
}
//=> 以上這段代碼相當于:
public static void notNull(String arg) {
if (arg != null) {
} else {
throw new NullPointerException("arg");
}
}
-
(較常用)@Cleanup
常用于資源釋放
public void CleanUp() {
try {
@Cleanup Jedis jedis = redisService.getJedis();
} catch (Exception e) {
e.printStackTrace();
}
//=> 以上這段代碼相當于:
Jedis jedis = null;
try {
jedis = redisService.getJedis();
} catch (Exception e) {
e.printStackTrace();
} finally {
if (jedis != null) {
try {
jedis.close();
} catch (Exception e) {
e.printStackTrace();
}
}
}
}
-
@Synchronized
類似于 Synchronized 關鍵字,但是可以隐藏同步鎖
public class SynchronizedExample {
private final Object readLock = new Object ();
@Synchronized
public static void test1() {
System.out.println("test1");
}
@Synchronized("readLock")
public void test2() {
System.out.println("test2");
}
}
//=> 以上這段代碼相當于:
public class SynchronizedExample {
private static final Object $LOCK = new Object[0];
private final Object readLock = new Object ();
@Synchronized
public static void test1() {
synchronized($LOCK) {
System.out.println("test1");
}
}
@Synchronized("readLock")
public void test2() {
synchronized(readLock) {
System.out.println("test2");
}
}
}
-
@NoArgsConstructor, @RequiredArgsConstructor、@AllArgsConstructor
分别對應可生成無參構造器,指定參數的構造器和包含全部字段的構造器。第1個和第3個注解還是比較挺實用的,如果要生成部分參數的構造器,部落客是比較建議手動生成,感覺注解還不太好用了。(注意:當類中有final字段沒有被初始化時,編譯器就會報錯,此時可用@NoArgsConstructor(force = true),然後就會為沒有初始化的final字段設定預設值 0 / false / null。而對于具有限制的字段(如@NonNull字段),則不會生成檢查或配置設定,是以要注意正确初始化final修飾的字段,否則這些限制都是無效的
-
(不常用)@Getter、@Setter、@ToString、@EqualsAndHashCode
這幾個注解都很好了解,見其名知其意,隻是要注意注解的使用位置。對于@Getter和@Setter,預設生成的方法是public的,如果要修改方法的修飾符,可以設定AccessLevel的值,如:@Getter(access = AccessLevel.PROTECTED)
-
(目測不常用)@Value,@SneakyThrows ...
一些注解的具體用法還是參考Lombok官網吧
小結
具體到實作原理方面,在下面的參考連結中也有相關的介紹,感興趣的還請自行研究。結合最近的使用情況,覺得最舒服的就是臨時加字段的情況下,也不需要我們再補上getter()、setter()和toString()。一般來說,我們隻需要在POJO上用
@Data
一個注解就基本滿足了,還有
@NoArgsConstructor,@AllArgsConstructor
這兩個注解有時候也經常用得上。
參考連結
lombok官網 lombok - 簡書 lombok的使用和原理 Java開發神器Lombok的使用與原理