Lombok快速入門

1. 什么是lombok

官網(wǎng)原話 :

Project Lombok is a java library that automatically plugs into your editor and build tools, spicing up your java.

Lombk是一個java庫 , 它可以自動注入到你的編輯器與構(gòu)建工具中 , 從而對java進行增強 .

Never write another getter or equals method again, with one annotation your class has a fully featured builder, Automate your logging variables, and much more.

通過一個注解 , 你的類就即可獲得一個功能齊全的構(gòu)建器 , 不用再重寫getterequals 方法(自動生成) , 以及會自動為你生成一個用于記錄日志的logger變量 與 其他更多功能 圆米。

總的來說 , lombok就是一個java庫 , 可以通過使用lombok提供的注解 , 從而可以省略一些重復代碼的編寫 , 例如getter , setter , equals 等方法的編寫. 添加相關(guān)注解之后 , 會在編譯階段自動為我們生成 , 從而提高了代碼可讀性.

2. 使用準備

Maven項目中引入如下依賴 :

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

視情況還需要在IDE中安裝lombok的插件 (這里以IDEA為例) :


1552065874909.png

安裝完重啟IDEA , 勾選如下配置 :


1552149258772.png

3. 常用注解解析

@NotNull

  • 作用 : 避免空指針異常 , 當被標識的變量為null時 , 會自動拋出NullPointerException

  • 作用位置 : 成員變量 , 方法形參

  • 代碼示例 :

    使用@NotNull :

    @Getter @Setter @NonNull
    private List<Person> members;
    

    等價的java源代碼 :

    @NonNull
    private List<Person> members;
    
    public Family(@NonNull final List<Person> members) {
        if (members == null) throw new java.lang.NullPointerException("members");
        this.members = members;
    }
        
    @NonNull
    public List<Person> getMembers() {
        return members;
    }
    
    //上面Members屬性同時使用了@NotNull與@Setter,相當于在setter方法中在形參前添加@NotNull注解
    //在形參前添加@NotNull相當于對形參進行空值判斷
    public void setMembers(@NonNull final List<Person> members) {
        if (members == null) {
            throw new java.lang.NullPointerException("members");
        }
        this.members = members;
    }
    

@Cleanup

  • 作用 : 自動幫我們調(diào)用資源對象的close()方法

  • 作用位置 : 資源對象變量上

  • 代碼示例 :

    使用@Cleanup注解 :

    public void testCleanUp() {
        try {
            @Cleanup ByteArrayOutputStream baos = new ByteArrayOutputStream();
            baos.write(new byte[] {'Y','e','s'});
            System.out.println(baos.toString());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

    等價的java源代碼 :

    public void testCleanUp() {
        try {
            ByteArrayOutputStream baos = new ByteArrayOutputStream();
            try {
                baos.write(new byte[]{'Y', 'e', 's'});
                System.out.println(baos.toString());
            } finally {
                baos.close();
            }
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    

@Getter & @Setter

  • 作用 :

    • @Getter : 生成對應的getter方法
    • @Setter : 生成對應的setter方法
  • 作用位置 : 成員變量上

  • 代碼示例 :

    使用@Getter@Setter :

    @Getter @Setter private boolean employed = true;
    @Setter(AccessLevel.PROTECTED) private String name; // AccessLevel.PROTECTED指定生成的構(gòu)造方法的權(quán)限修飾符為protected
    

    等價的java源代碼 :

    private boolean employed = true;
    private String name;
    
    public boolean isEmployed() {
        return employed;
    }
    
    public void setEmployed(final boolean employed) {
        this.employed = employed;
    }
    
    protected void setName(final String name) {
        this.name = name;
    }
    

@EqualsAndHashCode

  • 作用 : 根據(jù)成員變量生成equals()hashCode()
  • 作用位置 : 類上
  • 常用屬性 :
    • exclude : 指定要排除的屬性 ;
    • of : 指定根據(jù)哪些屬性生成equals()hashCode() 方法;
    • callSuper : 該值為true時 , 生成的equals()hashCode() 調(diào)用父類的equals()hashCode() 方法 , 默認值為false ;

@NoArgsConstructor & @AllArgsConstructor & @RequiredArgsConstructor

  • 作用 :

    • @NoArgsConstructor : 自動生成無參構(gòu)造方法 ;
    • @AllArgsConstructor : 自動生成全參的構(gòu)造方法 ;
    • @RequiredArgsConstructor : 對標識了@NotNull或者是final關(guān)鍵字的成員變量生成權(quán)限為private的構(gòu)造方法 , 如何想要對外提供使用可以指定staticName屬性生成一個static方法 ;
  • 作用位置 : 均在類上

  • 代碼示例 :

    使用lombok注解 :

    import lombok.AccessLevel;
    import lombok.RequiredArgsConstructor;
    import lombok.AllArgsConstructor;
    import lombok.NonNull;
    
    @RequiredArgsConstructor(staticName = "of") //生成一個static方法,方法名為of
    @AllArgsConstructor(access = AccessLevel.PROTECTED)
    public class ConstructorExample<T> {
      private int x, y;
      @NonNull private T description;
      
      @NoArgsConstructor
      public static class NoArgsExample {
        @NonNull private String field;
      }
    }
    

    等價的java源碼 :

    public class ConstructorExample<T> {
      private int x, y;
      @NonNull private T description;
      
      private ConstructorExample(T description) {
        if (description == null) throw new NullPointerException("description");
        this.description = description;
      }
      
      public static <T> ConstructorExample<T> of(T description) {
        return new ConstructorExample<T>(description);
      }
      
      @java.beans.ConstructorProperties({"x", "y", "description"})
      protected ConstructorExample(int x, int y, T description) {
        if (description == null) throw new NullPointerException("description");
        this.x = x;
        this.y = y;
        this.description = description;
      }
      
      public static class NoArgsExample {
        @NonNull private String field;
        
        public NoArgsExample() {
        }
      }
    }
    

@Data

  • 作用 : 自動為所有字段添加@ToString, @EqualsAndHashCode, @Getter方法售葡,為<font style="color:red">非final字段 </font>添加@Setter, 以及在類上添加@RequiredArgsConstructor

  • 作用位置 : 類上

  • 代碼示例 :

    使用@Data注解 :

    @Data(staticConstructor="of")
    public class Company {
        private final Person founder;
        private String name;
        private List<Person> employees;
    }
    

    等價的java源代碼 :

    public class Company {
        private final Person founder;
        private String name;
        private List<Person> employees;
        
        private Company(final Person founder) {
            this.founder = founder;
        }
        
        //對應staticConstructor="of" 
        public static Company of(final Person founder) {
            return new Company(founder);
        }
        
        public Person getFounder() {
            return founder;
        }
        
        public String getName() {
            return name;
        }
        
        public void setName(final String name) {
            this.name = name;
        }
        
        public List<Person> getEmployees() {
            return employees;
        }
        
        public void setEmployees(final List<Person> employees) {
            this.employees = employees;
        }
        
        @java.lang.Override
        public boolean equals(final java.lang.Object o) {
            if (o == this) return true;
            if (o == null) return false;
            if (o.getClass() != this.getClass()) return false;
            final Company other = (Company)o;
            if (this.founder == null ? other.founder != null : !this.founder.equals(other.founder)) return false;
            if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false;
            if (this.employees == null ? other.employees != null : !this.employees.equals(other.employees)) return false;
            return true;
        }
        
        @java.lang.Override
        public int hashCode() {
            final int PRIME = 31;
            int result = 1;
            result = result * PRIME + (this.founder == null ? 0 : this.founder.hashCode());
            result = result * PRIME + (this.name == null ? 0 : this.name.hashCode());
            result = result * PRIME + (this.employees == null ? 0 : this.employees.hashCode());
            return result;
        }
        
        @java.lang.Override
        public java.lang.String toString() {
            return "Company(founder=" + founder + ", name=" + name + ", employees=" + employees + ")";
        }
    }
    

@Slf4j

  • 作用 : 自動生成一個Logger的對象

  • 作用位置 : 類上

  • 代碼示例 :

    import lombok.extern.slf4j.Slf4j;
    import org.junit.Test;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    
    @Slf4j
    public class Slf4jTest {
        //@Slf4j等價于如下代碼
        //private final Logger log = LoggerFactory.getLogger(Slf4jTest.class);
    
        @Test
        public void slfTest() {
            log.debug("testing");
        }
    }
    

@Accessors

  • 作用 : 通過該注解可以控制gettersetter 的命名與返回值 ;

  • 作用位置 : 類上

  • 屬性 :

    • fluent : 默認值為false , 當fluent的值為true時 , @Data注解生成的 gettersetter 的方法名均為對應的成員變量名 , 且setter 的返回值為當前當前對象 , 如下所示;

      @Data
      @Accessors(fluent = true)
      class User {
          private Integer id;
          private String name;
          
          // 生成的getter和setter方法如下唱矛,方法體略
          public Integer id(){}
          public User id(Integer id){}
          public String name(){}
          public User name(String name){}
      }
      
    • chain : 默認值為false , 當chain的值為true時 , @Data注解生成的setter的返回值為當前對象 , 相當于開啟鏈式編程的開關(guān) , 代碼如下所示 ;

      @Data
      @Accessors(chain = true)
      class User {
          private Integer id;
          private String name;
          
          // 生成的setter方法如下赊级,setter返回的是當前User對象 , 方法體略
          public User setId(Integer id){}
          public User setName(String name){}
      }
      
    • prefix : 默認值為{} , 若指定prefix的值 , 則生成的gettersetter名為屬性名 , 且會忽略其指定的前綴同時遵循駝峰命名原則 , 如下代碼所示

      @Data
      @Accessors(prefix = "f")
      class User {
          private Integer fId; //屬性名帶f
          private String fName;
          
          // 生成的getter和setter方法如下半抱,方法體略
          public Integer id(){} // 生成的方法名為屬性名去掉前綴
          public void id(Integer id){}
          public String name(){}
          public void name(String name){}
      }
      

參考鏈接 :
[lombok @EqualsAndHashCode 注解的影響]:https://blog.csdn.net/zhanlanmg/article/details/50392266
[官方文檔]:https://projectlombok.org/features/all
[Lombok介紹及使用方法]:https://www.cnblogs.com/holten/p/5729226.html

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末,一起剝皮案震驚了整個濱河市艾船,隨后出現(xiàn)的幾起案子琅攘,更是在濱河造成了極大的恐慌,老刑警劉巖爆袍,帶你破解...
    沈念sama閱讀 217,657評論 6 505
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件首繁,死亡現(xiàn)場離奇詭異,居然都是意外死亡陨囊,警方通過查閱死者的電腦和手機弦疮,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,889評論 3 394
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來蜘醋,“玉大人胁塞,你說我怎么就攤上這事⊙褂铮” “怎么了啸罢?”我有些...
    開封第一講書人閱讀 164,057評論 0 354
  • 文/不壞的土叔 我叫張陵,是天一觀的道長胎食。 經(jīng)常有香客問我扰才,道長,這世上最難降的妖魔是什么厕怜? 我笑而不...
    開封第一講書人閱讀 58,509評論 1 293
  • 正文 為了忘掉前任衩匣,我火速辦了婚禮,結(jié)果婚禮上粥航,老公的妹妹穿的比我還像新娘琅捏。我一直安慰自己,他們只是感情好递雀,可當我...
    茶點故事閱讀 67,562評論 6 392
  • 文/花漫 我一把揭開白布柄延。 她就那樣靜靜地躺著,像睡著了一般映之。 火紅的嫁衣襯著肌膚如雪拦焚。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 51,443評論 1 302
  • 那天杠输,我揣著相機與錄音赎败,去河邊找鬼。 笑死蠢甲,一個胖子當著我的面吹牛僵刮,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播,決...
    沈念sama閱讀 40,251評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼搞糕,長吁一口氣:“原來是場噩夢啊……” “哼勇吊!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起窍仰,我...
    開封第一講書人閱讀 39,129評論 0 276
  • 序言:老撾萬榮一對情侶失蹤汉规,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后驹吮,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體针史,經(jīng)...
    沈念sama閱讀 45,561評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,779評論 3 335
  • 正文 我和宋清朗相戀三年碟狞,在試婚紗的時候發(fā)現(xiàn)自己被綠了啄枕。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 39,902評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡族沃,死狀恐怖频祝,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情脆淹,我是刑警寧澤常空,帶...
    沈念sama閱讀 35,621評論 5 345
  • 正文 年R本政府宣布,位于F島的核電站未辆,受9級特大地震影響窟绷,放射性物質(zhì)發(fā)生泄漏锯玛。R本人自食惡果不足惜咐柜,卻給世界環(huán)境...
    茶點故事閱讀 41,220評論 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望攘残。 院中可真熱鬧拙友,春花似錦、人聲如沸歼郭。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,838評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽病曾。三九已至牍蜂,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間泰涂,已是汗流浹背鲫竞。 一陣腳步聲響...
    開封第一講書人閱讀 32,971評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留逼蒙,地道東北人从绘。 一個月前我還...
    沈念sama閱讀 48,025評論 2 370
  • 正文 我出身青樓,卻偏偏與公主長得像,于是被迫代替她去往敵國和親僵井。 傳聞我的和親對象是個殘疾皇子陕截,可洞房花燭夜當晚...
    茶點故事閱讀 44,843評論 2 354

推薦閱讀更多精彩內(nèi)容

  • 安裝lombok 注意:我用的的idea,首先先把插件裝上批什,不然也不好使 getter和setter 我采用的是s...
    lijiaccy閱讀 323評論 0 1
  • rljs by sennchi Timeline of History Part One The Cognitiv...
    sennchi閱讀 7,331評論 0 10
  • Lombok可以減少很多重復代碼的書寫农曲。比如說getter/setter/toString等方法的編寫。IDEA安...
    MicoCube閱讀 2,028評論 0 1
  • **2014真題Directions:Read the following text. Choose the be...
    又是夜半驚坐起閱讀 9,495評論 0 23
  • “流水作文” 時間總是不禁意間在指尖流逝驻债,是時間拋棄我們還是我們拋棄了時間朋蔫,又到交作業(yè)的日子。 堅持却汉,我把寫作業(yè)當...
    遇踐自己閱讀 106評論 0 0