Idea插件之——Lombok生成getter/setter等方法簡化代碼


  Lombok實際上在我們項目的代碼里早就統一使用了,用起來很方便,這幾天在總結博客的Idea插件系列,今天總結一下Lombok。

一、Lombok是什么

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

  Lombok能通過注解的方式,在編譯時自動為屬性生成構造器、getter/setter、equals、hashcode、toString方法。出現的神奇就是在源碼中沒有getter和setter方法,但是在編譯生成的字節碼文件中有getter和setter方法。這樣就省去了手動重建這些代碼的麻煩,使代碼看起來更簡潔些。

 

二、Lombok優缺點

優點:

    1. 能通過注解的形式自動生成構造器、getter/setter、equals、hashcode、toString等方法,提高了一定的開發效率
    2. 讓代碼變得簡潔,不用過多的去關注相應的方法
    3. 屬性做修改時,也簡化了維護為這些屬性所生成的getter/setter方法等

缺點:

    1. 不支持多種參數構造器的重載
    2. 雖然省去了手動創建getter/setter方法的麻煩,但大大降低了源代碼的可讀性和完整性,降低了閱讀源代碼的舒適度

 

三、Lombok原理

  Lombok實現了JSR 269 API規范,javac在Java6開始支持這一規范,只要程序實現了該API,就能在javac運行的時候得到調用,那么Lombok在編譯時使用的就是javac,具體流程如下:

    

  首先是項目的源代碼文件,在經過編譯處理以后,lombok會使用自己的抽象語法樹去進行注解的匹配,如果在項目中的某一個類中使用了lombok中的注解,那么注解編譯器就會自動去匹配項目中的注解對應到在lombok語法樹中的注解文件,並經過自動編譯匹配來生成對應類中的getter或者setter方法,達到簡化代碼的目的。執行順序就如上圖的疊放順序。

四、Lombok常用注解

@Data注解:在JavaBean中使用,這個注解包含范圍最廣,它包含getter、setter、NoArgsConstructor注解,即當使用當前注解時,會自動生成包含的所有方法;

@builder注解:在JavaBean中使用,使用此注解可通過builder方式初始化對象

@getter注解:在JavaBean中使用,使用此注解會生成對應的getter方法;

@setter注解:在JavaBean中使用,使用此注解會生成對應的setter方法;

@NoArgsConstructor注解:在JJavaBean中使用,使用此注解會生成對應的無參構造方法;

@AllArgsConstructor注解:在JJavaBean中使用,使用此注解會生成對應的有參構造方法;

@ToString注解:在JJavaBean中使用,使用此注解會自動重寫對應的toStirng方法;

@EqualsAndHashCode注解:在JavaBean中使用,使用此注解會自動重寫對應的equals方法和hashCode方法;

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

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

 

五、Idea安裝Lombok插件

點擊File-- Settings--Plugins設置界面,安裝Lombok插件:

點擊File-- Settings--Build,Execution,Deployment設置界面,開啟 AnnocationProcessors,開啟該項是為了讓Lombok注解在編譯階段起到作用。

 

六、Lombok使用方法

pom.xml中引入lombok依賴

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

 

代碼中推薦寫法

@Data
@NoArgsConstructor
@Builder(toBuilder = true)
@AllArgsConstructor(access = AccessLevel.PRIVATE)
public class UserInfo {

    private String name;
    
    @Builder.Default
    private String email = "";

}

//@Builder注解賦值新對象
UserInfo userInfo = UserInfo.builder()
        .name("zzl")
        .email("bgood@sina.com")
        .build();


//@Builder注解修改原對象的屬性值,要求實體上添加@Builder(toBuilder=true)
 userInfo = userInfo.toBuilder()
        .name("OK")
        .email("zgood@sina.com")
        .build();

 


免責聲明!

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



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