首頁 > 軟體

Java開發神器Lombok安裝與使用詳解

2022-02-24 22:01:34

安裝

Lombok的安裝分兩部分:Idea外掛的安裝和maven中pom檔案的匯入。

Idea外掛的安裝

點選設定,選擇外掛,在Idea的外掛設定中搜尋Lombok(需要聯網)或官網下載本地安裝,點選初始化安裝

在外掛的描述中也能夠看到它支援的註解。

maven中pom檔案的匯入

第二步,引入pom中依賴,當前最細版本1.18.10。

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.18.10</version>
</dependency>

如果是通過Idea建立Spring Boot專案,可在建立專案時直接在“Developer Tool”中選擇Lombok。

完成了以上兩步,就可以在程式碼中使用該款神器了。

使用

這是官網給出的所支援的註解,在這我們也能檢視:https://projectlombok.org/features/all

在這裡給出常用的註解及其介紹:

val

使用val作為區域性變數宣告的型別,而不是實際寫入型別。 執行此操作時,將從初始化表示式推斷出型別。

public Map<String, String> getMap() {
	val map = new HashMap<String, String>();
	map.put("1", "a");
	return map;
}

效果如下:

public Map<String, String> getMap() {
    HashMap<String, String> map = new HashMap();
    map.put("1", "a");
    return map;
}

也就是說在區域性變數中,Lombok幫你推斷出具體的型別,但只能用於區域性變數中。

@Data

@Data最常用的註解之一。註解在類上,提供該類所有屬性的getter/setter方法,還提供了equals、canEqual、hashCode、toString方法。

就是開發人員不用手寫相應的方法,而Lombok會幫你生成上述所有方法。

使用@Data範例如下,最直觀的就是不用寫getter/setter方法。

@Data
public class Demo {
	private int id;
	private String remark;
}

我們看該類編譯之後是什麼樣子。

public class Demo {
    private int id;
    private String remark;

    public Demo() {
    }
    public int getId() {
        return this.id;
    public String getRemark() {
        return this.remark;
    public void setId(final int id) {
        this.id = id;
    public void setRemark(final String remark) {
        this.remark = remark;
    public boolean equals(final Object o) {
        if (o == this) {
            return true;
        } else if (!(o instanceof Demo)) {
            return false;
        } else {
            Demo other = (Demo)o;
            if (!other.canEqual(this)) {
                return false;
            } else if (this.getId() != other.getId()) {
            } else {
                Object this$remark = this.getRemark();
                Object other$remark = other.getRemark();
                if (this$remark == null) {
                    if (other$remark != null) {
                        return false;
                    }
                } else if (!this$remark.equals(other$remark)) {
                    return false;
                }
                return true;
            }
        }
    protected boolean canEqual(final Object other) {
        return other instanceof Demo;
    public int hashCode() {
        int PRIME = true;
        int result = 1;
        int result = result * 59   this.getId();
        Object $remark = this.getRemark();
        result = result * 59   ($remark == null ? 43 : $remark.hashCode());
        return result;
    public String toString() {
        return "Demo(id="   this.getId()   ", remark="   this.getRemark()   ")";
}

官網給的更加詳細,這裡只展現一部分,例如下圖是官網給的例子:

連結:https://projectlombok.org/features/Data

@Getter/@Setter

作用於屬性上,為該屬性提供getter/setter方法;
作用與類上,為該類所有的屬性提供getter/setter方法, 都提供預設構造方法。

使用@Getter/@Setter範例如下:

public class GetterSetterExample {
  @Getter @Setter private int age = 10;
  @Setter(AccessLevel.PROTECTED) private String name;
  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }
}

編譯後就是這個樣子:

public class GetterSetterExample {
  private int age = 10;
  private String name;
  
  @Override public String toString() {
    return String.format("%s (age: %d)", name, age);
  }
  public int getAge() {
    return age;
  public void setAge(int age) {
    this.age = age;
  protected void setName(String name) {
    this.name = name;
}

其餘例子就不展示了,大家可以去官網檢視詳細的,這裡只給出作用。

@Log4j

作用於類上,為該類提供一個屬性名為log的log4j紀錄檔物件。

@Log4j
public class Demo {

}

該屬性一般使用於Controller、Service等業務處理類上。與此註解相同的還有@Log4j2,顧名思義,針對Log4j2。

@AllArgsConstructor

作用於類上,為該類提供一個包含全部參的構造方法,注意此時預設構造方法不會提供。

@AllArgsConstructor
public class Demo {
	private int id;
	private String remark;
}

效果如下:

public class Demo {
    private int id;
    private String remark;

    public Demo(final int id, final String remark) {
        this.id = id;
        this.remark = remark;
    }
}

@NoArgsConstructor

作用於類上,提供一個無參的構造方法。

可以和@AllArgsConstructor同時使用,此時會生成兩個構造方法:無參構造方法和全參構造方法。

@EqualsAndHashCode

作用於類上,生成equals、canEqual、hashCode方法。

具體效果參看最開始的@Data效果,也可以參考官網。

@NonNull

作用於屬性上,提供關於此引數的非空檢查,如果引數為空,則丟擲空指標異常。

使用方法:

public class Demo {
	@NonNull
	private int id;
	private String remark;
}

@RequiredArgsConstructor

作用於類上,由類中所有帶有@NonNull註解或者帶有final修飾的成員變數作為引數生成構造方法。

@Cleanup

作用於變數,保證該變數代表的資源會被自動關閉,預設呼叫資源的close()方法,如果該資源有其它關閉方法,可使用@Cleanup(“methodName”)來指定。

public void jedisExample(String[] args) {
    try {
        @Cleanup Jedis jedis = redisService.getJedis();
    } catch (Exception ex) {
        logger.error(「Jedis異常:」,ex)
    }
}

效果相當於:

public void jedisExample(String[] args) {
    Jedis jedis= null;
    try {
        jedis = redisService.getJedis();
    } catch (Exception e) {
        logger.error(「Jedis異常:」,ex)
    } finally {
        if (jedis != null) {
            try {
                jedis.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}

@ToString

作用於類上,生成包含所有引數的toString方法。見@Data中toString方法。

@Value

作用於類上,會生成全引數的構造方法、getter方法、equals、hashCode、toString方法。

與@Data相比多了全參構造方法,少了預設構造方法、setter方法和canEqual方法。

該註解需要注意的是:會將欄位新增上final修飾,個人感覺此處有些失控,不太建議使用。

@SneakyThrows

作用於方法上,相當於把方法內的程式碼新增了一個try-catch處理,捕獲異常catch中用Lombok.sneakyThrow(e)丟擲異常。使用@SneakyThrows(BizException.class)指定丟擲具體異常。

@SneakyThrows
public int getValue(){
	int a = 1;
	int b = 0;
	return a/b;
}

效果如下:

public int getValue() {
    try {
        int a = 1;
        int b = 0;
        return a / b;
    } catch (Throwable var3) {
        throw var3;
    }
}

@Synchronized

作用於類方法或實體方法上,效果與synchronized相同。

區別在於鎖物件不同,對於類方法和實體方法,synchronized關鍵字的鎖物件分別是類的class物件和this物件,而@Synchronized的鎖物件分別是私有靜態final物件lock和私有final物件lock。也可以指定鎖物件。

public class FooExample { 
	private final Object readLock = new Object(); 
	@Synchronized 
	public static void hello() { 
	    System.out.println("world");   
	} 
	@Synchronized("readLock") 
	public void foo() { 
	  System.out.println("bar"); 
	} 
}

效果相當於如下:

public class FooExample { 
  private static final Object $LOCK = new Object[0]; 
  private final Object readLock = new Object(); 

  public static void hello() { 
    synchronized($LOCK) { 
      System.out.println("world"); 
    } 
  }   
  public void foo() { 
    synchronized(readLock) { 
        System.out.println("bar");   
  } 
}

@Builder

作用於類上,如果你喜歡使用Builder的流式操作,那麼@Builder可能是你喜歡的註解了。

使用方法:

@Builder
public class Demo {
	private int id;
	private String remark;
}

效果如下:

public class Demo {
    private int id;
    private String remark;

    Demo(final int id, final String remark) {
        this.id = id;
        this.remark = remark;
    }
    public static Demo.DemoBuilder builder() {
        return new Demo.DemoBuilder();
    public static class DemoBuilder {
        private int id;
        private String remark;
        DemoBuilder() {
        }
        public Demo.DemoBuilder id(final int id) {
            this.id = id;
            return this;
        public Demo.DemoBuilder remark(final String remark) {
            this.remark = remark;
        public Demo build() {
            return new Demo(this.id, this.remark);
        public String toString() {
            return "Demo.DemoBuilder(id="   this.id   ", remark="   this.remark   ")";
}

我們可以看到,在該類內部提供了DemoBuilder類用來處理具體的流式操作。同時提供了全參的構造方法。

到此這篇關於Java開發神器Lombok安裝與使用的文章就介紹到這了,更多相關Java Lombok安裝與使用內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com