天天看點

強大的lombok插件

最近做一個項目,發現實體類中僅僅隻是定義了變量,沒有任何setter,getter,方法,也沒有構造函數,但是卻可以正常的調用,仔細檢視後發現類上比之前所見的類多了一些注解,@Date,@EqualsAndHashCode.經過多方查找,終于大概弄明白了,現在寫出來一方面鞏固自己所學,順便供大家參考,有說的不好的地方,歡迎大家指出,共同進步...

一、Lombok是什麼

    現在看一下Lombok官方對其進行的解釋:Lombok官網:https://projectlombok.org

    Lombok項目是一種自動接通你的編輯器和建構工具的一個Java庫。不用再一次寫額外的getter或者equals方法。由此可以看出,lombok會幫我們自動生成getter和euqals方法,但是更有意思的是,當我們的變量發生改變時,我們不再需要修改對的getter、setter方法,lombok幫我們在運作的過程中自動生成上述方法,編碼更靈活.

是以,使用lombok的優點: 1、簡化long備援的javabean代碼;

                                        2、提高執行效率

二、如何使用Lombok

      1、引入依賴:(版本自行選擇)

<dependency>
    <groupId>org.projectlombok</groupId>
    <artifactId>lombok</artifactId>
    <version>1.16.18</version>
    <scope>provided</scope>
</dependency>
           

    有些情況下引入依賴還是不能使用(不能調用getter、setter),此時可以通過安裝插件解決:

強大的lombok插件

三、lombok中的常用注解

  • @Setter :在JavaBean或類JavaBean中使用,使用此注解會生成對應的setter方法;
  • @Getter:在JavaBean或類JavaBean中使用,使用此注解會生成對應的getter方法;
  • @ToString:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的toStirng方法;
  • @NoArgsConstructor:在JavaBean或類JavaBean中使用,使用此注解會生成對應的無參構造方法;
  • @HashCode:
  • @Equals:
  • @CanEqual:
  • @Data:在JavaBean或類JavaBean中使用,這個注解包含範圍最廣,它包含上述注解,即當使用目前注解時,會自動生成包含的所有方法;
  • @AllArgsConstructor:在JavaBean或類JavaBean中使用,使用此注解會生成對應的有參構造方法;
  • @Log(這是一個泛型注解,具體有很多種形式)
  • @EqualsAndHashCode:在JavaBean或類JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法;

1. 此注解會生成

equals(Object other)

hashCode()

方法。

2. 它預設使用非靜态,非瞬态的屬性

3. 可通過參數

exclude

排除一些屬性

4. 可通過參數

of

指定僅使用哪些屬性

5. 它預設僅使用該類中定義的屬性且不調用父類的方法

6. 可通過

callSuper=true

解決上一點問題。讓其生成的方法中調用父類的方法。

  • @Slf4j:在需要列印日志的類中使用,當項目中使用了slf4j列印日志架構時使用該注解,會簡化日志的列印流程,隻需調用info方法即可;
  • @Log4j:在需要列印日志的類中使用,當項目中使用了log4j列印日志架構時使用該注解,會簡化日志的列印流程,隻需調用info方法即可;

在使用以上注解需要處理參數時,處理方法如下(以@ToString注解為例,其他注解同@ToString注解):

@ToString(exclude="column")

意義:排除column列所對應的元素,即在生成toString方法時不包含column參數;

@ToString(exclude={"column1","column2"})

意義:排除多個column列所對應的元素,其中間用英文狀态下的逗号進行分割,即在生成toString方法時不包含多個column參數;

@ToString(of="column")

意義:隻生成包含column列所對應的元素的參數的toString方法,即在生成toString方法時隻包含column參數;;

@ToString(of={"column1","column2"})

意義:隻生成包含多個column列所對應的元素的參數的toString方法,其中間用英文狀态下的逗号進行分割,即在生成toString方法時隻包含多個column參數;

@Date一般和@EqualsAndHashCode同時使用,因為:

通過官方文檔,可以得知,當使用@Data注解時,則有了@EqualsAndHashCode注解,那麼就會在此類中存在equals(Object other) 和 hashCode()方法,且不會使用父類的屬性,這就導緻了可能的問題。

比如,有多個類有相同的部分屬性,把它們定義到父類中,恰好id(資料庫主鍵)也在父類中,那麼就會存在部分對象在比較時,它們并不相等,卻因為lombok自動生成的equals(Object other) 和 hashCode()方法判定為相等,進而導緻出錯。

修複此問題的方法很簡單:

1. 使用@Getter @Setter @ToString代替@Data并且自定義equals(Object other) 和 hashCode()方法,比如有些類隻需要判斷主鍵id是否相等即足矣。

2. 或者使用在使用@Data時同時加上@EqualsAndHashCode(callSuper=true)注解。