背景
最近在做一個小功能,又不想在原有體態臃腫的項目中追加,爲了調試方便並且可以快速開發就採用了springboot。由於使用了JPA,建了幾個類,然後通過IDE去生成其屬性的構造器、getter、setter、equals、hashcode、toString方法,那麼Java中有沒有一種方式能夠避免這種重複的勞動呢?答案是有,想着前幾天聽說有一款簡化神奇Lombok,特此拿來玩玩記錄一下。
簡介
Lombok是一個可以通過簡單的註解形式來幫助我們簡化消除一些必須有但顯得很臃腫的Java代碼的工具,通過使用對應的註解,可以在編譯源碼的時候生成對應的方法。
官方地址:https://projectlombok.org/
github地址:https://github.com/rzwitserloot/lombok
Lombok註解
下面對Lombok的簡單使用方法做一下總結:
- @NotNull 作用在方法參數上的註解,用於自動生成空值參數檢查。
- @Cleanup 作用在局部變量上,在作用域結束時會自動調用close方法釋放資源。
- @Getter 作用在字段上,會自動生成字段的Getter;作用在類上,會自動生成該類所有非靜態字段的Getter,還能控制Getter的訪問級別
- @Setter 基本同上。
- @ToString 類註解,自動生成類的toString方法,可以做一些定製,比如不使用某個字段,不調用Getters等。
- @EqualsAndHashCode 類註解,自動生成類中所有非靜態非瞬時字段的equals方法和hashCode方法。
- @NoArgsConstructor 類註解,自動生成一個無參構造函數。
- @AllArgsConstructor 類註解,生成一個初始化所有字段的構造函數。
- @RequiredArgsConstructor 類註解,爲final字段和標記了@NotNull的字段生成構造函數。
- @Data 類註解,相當於同時應用了@Getter、@Setter、@ToString、@EqualsAndHashCode、@RequiredArgsConstructor。如果已經定義了一個構造方法,就不會再自動生成構造方法了。
- @Value 類註解,和@Data類似,但是用於不可變類型。生成的類和所有字段都設置爲final,所有字段都爲private,自動生成Getter但是沒有Setter,會生成初始化所有字段的構造函數。相當於同時應用了final @ToString、 @EqualsAndHashCode、 @AllArgsConstructor 、@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)和 @Getter。
實際開發中一般常用到的:
@Data
@NoArgsConstructor
@AllArgsConstructor
這三個,其他的沒特殊需求可以自行忽略。
maven引用
由於開發中我們使用了Maven,直接在pom.xml中引入以下座標:
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.14</version>
</dependency>
下面是簡單Bean示例:
@Data // 生成 getter/setter/equals/canEqual/hashCode/toString
@NoArgsConstructor // 爲類提供一個無參的構造方法
@AllArgsConstructor // 爲類提供一個全參的構造方法
public class User {
private Integer id;
private String name;
private Integer age;
}
爲了對比效果,下面是我們平時生成的Bean:
public class User {
private Integer id;
private String name;
private Integer age;
public User() {
super();
}
public User(Integer id, String name, Integer age) {
super();
this.id = id;
this.name = name;
this.age = age;
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getAge() {
return age;
}
public void setAge(Integer age) {
this.age = age;
}
}
可以看到,由於應用了@Data註解和兩個構造方法註解,代碼變得非常短小易讀。當然Lombok也是存在諸多問題的,比如無法支持多種參數構造器的重載,需要安裝IDE插件實現get,set效果。
Lombok原理
雖然Lombok也用到了註解,但是它並沒有用到反射,而是通過一些奇技淫巧,在代碼編譯時期動態將註解替換爲具體的代碼。所以JVM實際運行的代碼,和我們手動編寫的包含了各種工具方法的類相同。
插件安裝
其實,一開始博主以爲不需要任何插件支持的,即使項目中引入了座標,當你get屬性的時候也會報錯。
官網中其實提供了相關的配置,由於使用的是Eclipse,這裏簡單的說下Eclipse種的安裝步驟。
1.下載lombok.jar包https://projectlombok.org/download.html
2.雙擊運行(有些系統安裝的壓縮包的問題可能無法執行)
3.重啓Eclipse,然後update一下Maven項目即可。