JAVA奇技淫巧簡化代碼之lombok


背景

最近在做一個小功能,又不想在原有體態臃腫的項目中追加,為了調試方便並且可以快速開發就采用了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.雙擊運行(有些系統安裝的壓縮包的問題可能無法執行)
1.png

2.png

3.重啟Eclipse,然后update一下Maven項目即可。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM