Project Lombok——帶給你簡潔、清晰的程式碼
阿新 • • 發佈:2020-12-08
相信但凡有一點Java程式設計經歷的人,都見過或者寫過下面這種程式碼。這是一個簡單的POJO,只有4個fields,加上構造器、`equals`、`hash`、`toString`以及各種`getter setter`,前前後後加起來大約70多行程式碼。這還只是4個fields,如果有十個以上,那麼程式碼行數輕輕鬆鬆過一百。如果老闆或主顧們按程式碼行數給錢的話,Java程式設計師應該都發財了。
```java
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
public Mountain(String name, double latitude, double longitude, String country) {
//...巴拉巴拉
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Mountain mountain = (Mountain) o;
return Double.compare(mountain.latitude, latitude) == 0 &&
Double.compare(mountain.longitude, longitude) == 0 &&
Objects.equals(name, mountain.name) && Objects.equals(country, mountain.country);
}
//各種getter setter toString hashCode...etc
}
```
有了程式碼自動生成,這種苦痛會稍微降低點,但是你的程式碼仍然會顯得“髒亂”。[Project Lombok](https://projectlombok.org/),一個成熟的library,通過編譯期插入的方式,大量減少樣板程式碼,讓你的程式碼顯得乾淨、簡潔、易讀。相信很多人都用上了,沒用的,建議趕緊上車。
## 安裝
在Maven的pom檔案中加入
```xml
```
即可安裝成功。你也可以到官網下載jar包,通過IDE直接匯入,但是不推薦。竊以為,連前端都少不了npm的年代,Maven和Gradle至少二選一。
另外,譬如`IntelliJ Idea`這種IDE,需要在`plugin market`裡搜尋`lombok`,下載並安裝相關外掛,否則IDE會報錯。
## 使用註解簡化程式碼
這裡主要介紹一些常用註解。
### 剪除getter、setter樣板程式碼
```java
@Setter @Getter @EqualsAndHashCode @ToString(exclude = {"country"})
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
```
註解的名稱幾乎都是自解釋的。
`@Setter`、`@Getter`可以生成全部非靜態field的getter和setter方法,`@EqualsAndHashCode`可以生成標準的`equals()`和`hashCode()`方法。`@ToString`,顧名思義,生成`toString()`方法,其中`exclude`屬性用於排除不想出現在返回值中的field。
![](https://img2020.cnblogs.com/blog/758765/202012/758765-20201208142641913-190213121.png)
從圖中也可以看出,各種`getter `、`equals`等方法,已經在編譯期生成了。
另外`@Setter`、`@Getter`也可以註解到filed上,對於某些field,我們只想提供`getter`方法,直接註解field的方式更加靈活。
### 空值檢查——@NonNull
```java
@Setter @Getter @NonNull
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
```
通過`@NonNull`註解,可以自動檢查`setter`方法的入參是否非空,當傳入`null`值時,則丟擲空指標異常。它等同於以下實現,
```java
public id setName(@NonNull final String name){
if(name == null) throw
new java.lang.NullPointerException("name");
this.name = name;
}
```
### 生成構造器
```java
@NoArgsConstructor @AllArgsConstructor
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
```
使用`@NoArgsConstructor`可以生成空參構造器,就像編譯器平日為我們做的一樣。`@AllArgsConstructor`可以生成包含全部非靜態field的構造器。
### 融合多個註解——@Data
以上一個一個註解的新增上去,仍然非常的繁瑣,有沒有一鍵搞定的註解?
```java
@Data @AllArgsConstructor
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
}
```
`@Data`,相當於`@ToString`+ `@EqualsAndHashCode`+`@Getter`+`@Setter`+`@RequiredArgsConstructor`。配合`@AllArgsConstructor`幾乎能覆蓋日常大部分需求。
另外,`@Data`還有一個親兄弟——`@value`,功能幾乎等同於`@Data`+`@AllArgsConstructor`,不同的是,它生成的是不可變類(Immutable class)。在`class`關鍵字前會自動加上`final`修飾符,且不再提供各個`field`的`setter`引數。
### 生成構造器——@Build
```java
@Builder
public class Mountain {
private String name;
private double latitude, longitude;
private String country;
```
`@Build`註解可以提供給當前物件一個構造器。不知道有咩有童鞋有過這樣的經歷,為了提供不同field組合的初始化構造器,結果必須寫一大堆構造器過載方法。如果有10+的filed的話,僅僅構造器就有100行程式碼。對於這種情況,《Effetive Java》的作者建議,我們應該提供一個構造器,而不是過載一堆讓人眼花繚亂的構造器。現在,我們僅僅新增一個`@Build`,就可以做到大神提供的最佳實踐。
其呼叫起來也非常簡單:
```java
Mountain.builder()
.name("tai")
.country("china").latitude(22.456).build();
```
這樣看起來是不是更加的舒服、簡潔呢!
## 結語以及其他
另外還有`@Cleanup`註解,它相當於**try-with-resource**的另一個版本,避免手動呼叫各種醜陋的`close()`方法。在Java7之前這是很好用的,現在也可以作為你的備選項。
`@Synchronized`,用於標註靜態方法,相當於原生的`syncronize`關鍵字。
`@Log4j2`配合apache的*log4j2*庫使用,註解在class級別上
```java
@Log4j
public class TestModel {
public void hello(){
log.info("log....");
}
}
```
以上都是一些常用的註解,他們可以消除我們日常大部分的POJO樣板程式碼,使程式碼保持簡潔、易讀,更多特性和註解可以參考[官方文件](https://projectlombok.org/features/