天天看點

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

以前的Java項目中,充斥着太多不友好的代碼:POJO的getter/setter/toString;異常處理;I/O流的關閉操作等等,這些樣闆代碼既沒有技術含量,又影響着代碼的美觀,Lombok應運而生。

任何技術的出現都是為了解決某一類問題,如果在此基礎上再建立奇技淫巧,不如回歸Java本身,應該保持合理使用而不濫用。

Lombok的使用非常簡單:

1)引入相應的maven包

  1. <dependency>

  2. <groupId>org.projectlombok</groupId>

  3. <artifactId>lombok</artifactId>

  4. <version>1.16.18</version>

  5. <scope>provided</scope>

  6. </dependency>

Lombok的scope=provided,說明它隻在編譯階段生效,不需要打入包中。事實正是如此,Lombok在編譯期将帶Lombok注解的Java檔案正确編譯為完整的Class檔案。

2)添加IDE工具對Lombok的支援

IDEA中引入Lombok支援如下:

點選File-- Settings設定界面,安裝Lombok插件:

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

點選File-- Settings設定界面,開啟

AnnocationProcessors

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

開啟該項是為了讓Lombok注解在編譯階段起到作用。

Eclipse的Lombok插件安裝可以自行百度,也比較簡單,值得一提的是,由于Eclipse内置的編譯器不是Oracle javac,而是eclipse自己實作的Eclipse Compiler for Java (ECJ).要讓ECJ支援Lombok,需要在eclipse.ini配置檔案中添加如下兩項内容:

  1. -Xbootclasspath/a:[lombok.jar所在路徑]

3)Lombok實作原理

自從Java 6起,javac就支援“JSR 269 Pluggable Annotation Processing API”規範,隻要程式實作了該API,就能在javac運作的時候得到調用。

Lombok就是一個實作了"JSR 269 API"的程式。在使用javac的過程中,它産生作用的具體流程如下:

  1. javac對源代碼進行分析,生成一棵抽象文法樹(AST)
  2. javac編譯過程中調用實作了JSR 269的Lombok程式
  3. 此時Lombok就對第一步驟得到的AST進行處理,找到Lombok注解所在類對應的文法樹(AST),然後修改該文法樹(AST),增加Lombok注解定義的相應樹節點
  4. javac使用修改後的抽象文法樹(AST)生成位元組碼檔案

4) Lombok注解的使用

POJO類常用注解:

@Getter/@Setter: 作用類上,生成所有成員變量的getter/setter方法;作用于成員變量上,生成該成員變量的getter/setter方法。可以設定通路權限及是否懶加載等。

  1. package com.trace;

  2. import lombok.AccessLevel;

  3. import lombok.Getter;

  4. import lombok.Setter;

  5. @SuppressWarnings("unused")

  6. public

    class

    TestClass

    {

  7. public

    static

    void main(String[] args)

    {

  8. }

  9. @Getter(value =

    AccessLevel.PUBLIC)

  10. @Setter(value =

    AccessLevel.PUBLIC)

  11. public

    static

    class

    Person

    {

  12. private

    String name;

  13. private

    int age;

  14. private

    boolean friendly;

  15. }

  16. public

    static

    class

    Animal

    {

  17. private

    String name;

  18. private

    int age;

  19. @Getter

    @Setter

    private

    boolean funny;

  20. }

  21. }

在Structure視圖中,可以看到已經生成了getter/setter等方法:

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

編譯後的代碼如下:[這也是傳統Java程式設計需要編寫的樣闆代碼]

  1. //

  2. // Source code recreated from a .class file by IntelliJ IDEA

  3. // (powered by Fernflower decompiler)

  4. //

  5. package com.trace;

  6. public

    class

    TestClass

    {

  7. public

    TestClass()

    {

  8. }

  9. public

    static

    void main(String[] args)

    {

  10. }

  11. public

    static

    class

    Animal

    {

  12. private

    String name;

  13. private

    int age;

  14. private

    boolean funny;

  15. public

    Animal()

    {

  16. }

  17. public

    boolean isFunny()

    {

  18. return

    this.funny;

  19. }

  20. public

    void setFunny(boolean funny)

    {

  21. this.funny = funny;

  22. }

  23. }

  24. public

    static

    class

    Person

    {

  25. private

    String name;

  26. private

    int age;

  27. private

    boolean friendly;

  28. public

    Person()

    {

  29. }

  30. public

    String getName()

    {

  31. return

    this.name;

  32. }

  33. public

    int getAge()

    {

  34. return

    this.age;

  35. }

  36. public

    boolean isFriendly()

    {

  37. return

    this.friendly;

  38. }

  39. public

    void setName(String name)

    {

  40. this.name = name;

  41. }

  42. public

    void setAge(int age)

    {

  43. this.age = age;

  44. }

  45. public

    void setFriendly(boolean friendly)

    {

  46. this.friendly = friendly;

  47. }

  48. }

  49. }

@ToString:作用于類,覆寫預設的toString()方法,可以通過of屬性限定顯示某些字段,通過exclude屬性排除某些字段。

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

@EqualsAndHashCode:作用于類,覆寫預設的equals和hashCode

@NonNull:主要作用于成員變量和參數中,辨別不能為空,否則抛出空指針異常。

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

@NoArgsConstructor, @RequiredArgsConstructor, @AllArgsConstructor:作用于類上,用于生成構造函數。有staticName、access等屬性。

staticName屬性一旦設定,将采用靜态方法的方式生成執行個體,access屬性可以限定通路權限。

@NoArgsConstructor:生成無參構造器;

@RequiredArgsConstructor:生成包含final和@NonNull注解的成員變量的構造器;

@AllArgsConstructor:生成全參構造器。

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

編譯後結果:

  1. public

    static

    class

    Person

    {

  2. @NonNull

  3. private

    String name;

  4. private

    int age;

  5. private

    boolean friendly;

  6. public

    String toString()

    {

  7. return

    "TestClass.Person(name="

    +

    this.getName()

    +

    ", age="

    +

    this.getAge()

    +

    ")";

  8. }

  9. @NonNull

  10. public

    String getName()

    {

  11. return

    this.name;

  12. }

  13. public

    int getAge()

    {

  14. return

    this.age;

  15. }

  16. public

    boolean isFriendly()

    {

  17. return

    this.friendly;

  18. }

  19. public

    void setName(@NonNull

    String name)

    {

  20. if(name ==

    null)

    {

  21. throw

    new

    NullPointerException("name");

  22. }

    else

    {

  23. this.name = name;

  24. }

  25. }

  26. public

    void setAge(int age)

    {

  27. this.age = age;

  28. }

  29. public

    void setFriendly(boolean friendly)

    {

  30. this.friendly = friendly;

  31. }

  32. private

    Person()

    {

  33. }

  34. private

    static

    TestClass.Person of()

    {

  35. return

    new

    TestClass.Person();

  36. }

  37. @ConstructorProperties({"name"})

  38. Person(@NonNull

    String name)

    {

  39. if(name ==

    null)

    {

  40. throw

    new

    NullPointerException("name");

  41. }

    else

    {

  42. this.name = name;

  43. }

  44. }

  45. @ConstructorProperties({"name",

    "age",

    "friendly"})

  46. public

    Person(@NonNull

    String name,

    int age,

    boolean friendly)

    {

  47. if(name ==

    null)

    {

  48. throw

    new

    NullPointerException("name");

  49. }

    else

    {

  50. this.name = name;

  51. this.age = age;

  52. this.friendly = friendly;

  53. }

  54. }

  55. }

@Data:作用于類上,是以下注解的集合:@ToString @EqualsAndHashCode @Getter @Setter @RequiredArgsConstructor

@Builder:作用于類上,将類轉變為建造者模式

@Log:作用于類上,生成日志變量。針對不同的日志實作産品,有不同的注解:

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

其他重要注解:

@Cleanup:自動關閉資源,針對實作了java.io.Closeable接口的對象有效,如:典型的IO流對象

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

編譯後結果如下:

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

是不是簡潔了太多。

@SneakyThrows:可以對受檢異常進行捕捉并抛出,可以改寫上述的main方法如下:

eclipse lombok插件安裝_IDEA中用好Lombok,撸碼效率至少提升5倍

@Synchronized:作用于方法級别,可以替換synchronize關鍵字或lock鎖,用處不大。

來源:http://t.cn/EXhxRzV

版權申明:内容來源網絡,版權歸原創者所有。除非無法确認,我們都會标明作者及出處,如有侵權煩請告知,我們會立即删除并表示歉意。謝謝。

繼續閱讀