使用 Lombok 來優雅的編碼

Lombok 能以簡單的註解形式來簡化 java 代碼,提升開發人員的開發效率。例如開發中常常須要寫的 javabean,都須要花時間去添加相應的 getter/setter,也許還要去寫構造器equals等方法,並且須要維護,當屬性多時會出現大量的 getter/setter方法,這些顯得很冗長也沒有太多技術含量,一旦修改屬性,就容易出現忘記修改對應方法的失誤。html

Lombok 能經過註解的方式,在編譯時自動爲屬性生成構造器getter/setterequalshashcodetoString方法。出現的神奇就是在源碼中沒有 gettersetter 方法,可是在編譯生成的字節碼文件中有 gettersetter方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。java

1. 安裝 lombok 插件

使用前須要安裝 lombok 插件bash

IDEA插件安裝地址maven

Eclipse插件安裝地址ide

2. 插件配置

查看最新版本ui

<dependencies>
	<dependency>
		<groupId>org.projectlombok</groupId>
		<artifactId>lombok</artifactId>
		<version>1.18.6</version>
		<scope>provided</scope>
	</dependency>
</dependencies>
複製代碼

3. 經常使用的註解

  • @Setter @Getter :能夠爲相應的屬性自動生成 Getter/Setter 方法。
import lombok.Getter;
import lombok.Setter;
import lombok.ToString;
import java.util.Date;
 
@Setter
@Getter
@ToString
public class User {
    private Integer id;
    private String name;
    private Integer age;
    private String sex; 
    private Date birthday;
}
複製代碼
  • @NonNull :該註解用在屬性或構造器上,Lombok 會生成一個非空的聲明,可用於校驗參數,能幫助避免空指針。
import lombok.NonNull;
 
public class NonNullExample extends Something {
    private String name;
    
    public NonNullExample(@NonNull Person person) {
        super("Hello");
        this.name = person.getName();
    }
}
複製代碼
  • @Cleanup :該註解能幫助咱們自動調用 close() 方法,很大的簡化了代碼。
import lombok.Cleanup;
import java.io.*;
 
public class CleanupExample {
    public static void main(String[] args) throws IOException {
        @Cleanup InputStream in = new FileInputStream(args[0]);
        @Cleanup OutputStream out = new FileOutputStream(args[1]);
        byte[] b = new byte[10000];
        while (true) {
            int r = in.read(b);
            if (r == -1) break;
            out.write(b, 0, r);
        }
    }
}
複製代碼
  • @EqualsAndHashCode :默認狀況下,會使用全部非靜態(non-static)和非瞬態(non-transient)屬性來生成 equalshasCode,也能經過 exclude 註解來排除一些屬性。
import lombok.EqualsAndHashCode;
 
@EqualsAndHashCode(exclude={"id", "shape"})
public class EqualsAndHashCodeExample {
    private transient int transientVar = 10;
    private String name;
    private double score;
    private Shape shape = new Square(5, 10);
    private String[] tags;
    private int id;
    
    public String getName() {
        return this.name;
    }
    
    @EqualsAndHashCode(callSuper=true)
    public static class Square extends Shape {
        private final int width, height;
        
        public Square(int width, int height) {
            this.width = width;
            this.height = height;
        }
    }
}
複製代碼
  • @ToString :類使用 @ToString 註解,Lombok 會生成一個 toString() 方法,默認狀況下,會輸出類名、全部屬性(會按照屬性定義順序),用逗號來分割。

代替效果爲:this

@Override 
public String toString() {
    return "Square(super=" + super.toString() + ", width=" + this.width + ", height=" + this.height + ")";
}
複製代碼
  • @Data :註解在類上,會爲類的全部屬性自動生成 setter/getterequalscanEqualhashCodetoString 方法,如爲 final 屬性,則不會爲該屬性生成 setter 方法。這個註解但是說是很是強大。

lombok的工做原理:

Lombok 本質上就是一個實現了「JSR 269 API」的程序。在使用 javac 的過程當中,它產生做用的具體流程以下:spa

  1. javac 對源代碼進行分析,生成了一棵抽象語法樹(AST)
  2. 運行過程當中調用實現了「JSR 269 API」的 Lombok 程序
  3. 此時 Lombok 就對第一步驟獲得的AST進行處理,找到 @Data 註解所在類對應的語法樹(AST),而後修改該語法樹(AST),增長 getter 和 setter 方法定義的相應樹節點
  4. javac 使用修改後的抽象語法樹(AST)生成字節碼文件,即給 class 增長新的節點(代碼塊)
相關文章
相關標籤/搜索