Java 類庫:Lombok

前言

??前陣子閑逛的時(shí)候,留意到了Lombok這個(gè)Java第三方庫,后來親自試用了一下,還真有一種相見恨晚的感覺,對(duì)于博主這樣的懶人來說,這簡(jiǎn)直是太實(shí)用了。這不趁周末,趕緊把好東西寫出來分享一下。

Lombok

引述官網(wǎng)介紹:

??Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.Never write another getter or equals method again. Early access to future java features such as val, and much more.
??Lombok是一個(gè)java庫,它可以自動(dòng)插入您的編輯器和構(gòu)建工具,為您的java提供幫助。再也不要寫其他的getter或equals方法了。盡早訪問諸如val之類的未來java特性。

??Tip:?jiǎn)稳隧?xiàng)目開發(fā)中使用極佳,或多人協(xié)作開發(fā)中強(qiáng)制要求使用相同環(huán)境。因?yàn)樾枰渲玫脑?,但目前編輯器和編譯器還沒有那么智能和友善o(╥﹏╥)o...

效果

  • 未使用Lombok前的POJO大概是這樣的(為了方便,下面把Entity、DTO、VO之類的都統(tǒng)稱為POJO)
public class User {

    private Integer id;

    private String nickname;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getNickname() {
        return nickname;
    }

    public void setNickname(String nickname) {
        this.nickname = nickname;
    }

    @Override
    public String toString() {
        return "User{" +
                "nickname='" + nickname + '\'' +
                ", id=" + id +
                '}';
    }

}
  • 使用了Lombok之后的POJO大概是這樣的
@Data
public class User {

    private Integer id;

    private String nickname;

}

搭建

  1. 添加依賴
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
            <optional>true</optional>
        </dependency>
  1. 下載插件(IDEA)
  1. 配置支持

??PS:IDEA中的Spring Initializr已集成Lombok,新建Spring Boot項(xiàng)目的時(shí)候勾選Lombok選擇即可

說明圖

??下面先來看下Lombok中幾個(gè)主要常用注解介紹說明圖:

具體說明

  • @Data(常用)

??在類上使用此注解,相當(dāng)于為當(dāng)前類的非final字段添加了getter()、setter()、toString()、equals()以及hashCode()方法,同時(shí)這也是一個(gè)多功能組合注解,組合了下面的@ToString,@EqualsAndHashCode,@Getter,@Setter和@RequiredArgsConstructor這五個(gè)注解

  • @Builder(常用)

??此注解需用在類上。Lombok底層通過構(gòu)造者模式來轉(zhuǎn)換當(dāng)前類,在項(xiàng)目實(shí)際使用的時(shí)候,我們可以以參數(shù)鏈的形式組裝該對(duì)象,或者是以全參構(gòu)造器的形式來new一個(gè)當(dāng)前對(duì)象。當(dāng)組合使用@Data注解的時(shí)候(一般來說是沒必要的),Lombok也不會(huì)再為當(dāng)前對(duì)象生成getter()、setter()方法。使用鏈?zhǔn)綐?gòu)造一個(gè)對(duì)象會(huì)顯得更加優(yōu)雅,所以這個(gè)注解也是非常實(shí)用的

  • @Builder.Default(常用)

??此注解用在字段上。當(dāng)前類使用了@Builder進(jìn)行構(gòu)造且某些字段含有默認(rèn)值的情況下,需要為這些字段添加此注解,不加此注解默認(rèn)值在構(gòu)造的時(shí)候是不生效的,需要進(jìn)行手動(dòng)設(shè)值

  • @Slf4j(常用)
    private final Logger logger = LoggerFactory.getLogger(getClass());

??上面這段代碼很熟悉吧。為當(dāng)前類添加@Slf4j后,我們就可以舍棄這段代碼了,是不是簡(jiǎn)潔多了

  • val, var(常用)

??val將局部變量申明為final類型,而var則用于修飾變量但不是final類型

    val noLombok = new HashSet<String>();
    var noLombok2=new ArrayList<Integer>();
    
    ////=> 以上這段代碼相當(dāng)于:
    final Set<String> useLombok = new HashSet<>();
    List<Integer> useLombok2=new ArrayList<>();
  • @NonNull(常用)

??該注解能夠?yàn)榉椒?,或?gòu)造函數(shù)的參數(shù)提供非空檢查

    public void notNull(@NonNull String arg) {
    }
    
    //=> 以上這段代碼相當(dāng)于:
    public static void notNull(String arg) {
        if (arg != null) {
        } else {
            throw new NullPointerException("arg");
        }
    }
  • @Cleanup(較常用)

??常用于資源釋放

 public void CleanUp() {
        try {
            @Cleanup Jedis jedis = redisService.getJedis();
        } catch (Exception e) {
            e.printStackTrace();
        }

        //=> 以上這段代碼相當(dāng)于:
        Jedis jedis = null;
        try {
            jedis = redisService.getJedis();
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            if (jedis != null) {
                try {
                    jedis.close();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    }
  • @Synchronized(較常用)

??類似于 Synchronized 關(guān)鍵字,但是可以隱藏同步鎖

public class SynchronizedExample {
 
    private final Object readLock = new Object ();
 
    @Synchronized
    public static void test1() {
        System.out.println("test1");
    }
 
    @Synchronized("readLock")
    public void test2() {
        System.out.println("test2");
    }

}

 //=> 以上這段代碼相當(dāng)于:
public class SynchronizedExample {
 
    private static final Object $LOCK = new Object[0];
    private final Object readLock = new Object ();
 
    @Synchronized
    public static void test1() {
        synchronized($LOCK) {
            System.out.println("test1");
        }
    }
 
    @Synchronized("readLock")
    public void test2() {
        synchronized(readLock) {
            System.out.println("test2");
        }
    }

}
 
  • @NoArgsConstructor, @RequiredArgsConstructor、@AllArgsConstructor (較常用)

??分別對(duì)應(yīng)可生成無參構(gòu)造器,指定參數(shù)的構(gòu)造器和包含全部字段的構(gòu)造器。第1個(gè)和第3個(gè)注解還是比較挺實(shí)用的,如果要生成部分參數(shù)的構(gòu)造器,博主是比較建議手動(dòng)生成,感覺注解還不太好用了。(注意:當(dāng)類中有final字段沒有被初始化時(shí),編譯器就會(huì)報(bào)錯(cuò),此時(shí)可用@NoArgsConstructor(force = true),然后就會(huì)為沒有初始化的final字段設(shè)置默認(rèn)值 0 / false / null。而對(duì)于具有約束的字段(如@NonNull字段),則不會(huì)生成檢查或分配,因此要注意正確初始化final修飾的字段,否則這些約束都是無效的

  • @Getter、@Setter、@ToString、@EqualsAndHashCode (不常用)

??這幾個(gè)注解都很好理解,見其名知其意,只是要注意注解的使用位置。對(duì)于@Getter和@Setter,默認(rèn)生成的方法是public的,如果要修改方法的修飾符,可以設(shè)置AccessLevel的值,如:@Getter(access = AccessLevel.PROTECTED)

  • @Value,@SneakyThrows ...(目測(cè)不常用)

??一些注解的具體用法還是參考Lombok官網(wǎng)吧

小結(jié)

??具體到實(shí)現(xiàn)原理方面,在下面的參考鏈接中也有相關(guān)的介紹,感興趣的還請(qǐng)自行研究。結(jié)合最近的使用情況,覺得最舒服的就是臨時(shí)加字段的情況下,也不需要我們?cè)傺a(bǔ)上getter()、setter()和toString()。一般來說,我們只需要在POJO上用@Data 一個(gè)注解就基本滿足了,還有@NoArgsConstructor,@AllArgsConstructor這兩個(gè)注解有時(shí)候也經(jīng)常用得上。

參考鏈接

lombok官網(wǎng)
lombok - 簡(jiǎn)書
lombok的使用和原理
Java開發(fā)神器Lombok的使用與原理

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容