IDEA中用好Lombok队腐,擼碼效率至少提升5倍

作者:LiWenD

http://t.cn/EXhxRzV

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

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

Lombok的使用非常簡單:

引入相應的maven包

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

Lombok的scope=provided拱她,說明它只在編譯階段生效,不需要打入包中扔罪。事實正是如此秉沼,Lombok在編譯期將帶Lombok注解的Java文件正確編譯為完整的Class文件。

添加IDE工具對Lombok的支持

IDEA中引入Lombok支持如下:

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

image

點擊File-- Settings設置界面唬复,開啟 AnnocationProcessors

image

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

Eclipse的Lombok插件安裝可以自行百度全肮,也比較簡單敞咧,值得一提的是,由于Eclipse內置的編譯器不是Oracle javac辜腺,而是eclipse自己實現的Eclipse Compiler for Java (ECJ).要讓ECJ支持Lombok休建,需要在eclipse.ini配置文件中添加如下兩項內容:

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

</pre>

Lombok實現原理

自從Java 6起,javac就支持“JSR 269 Pluggable Annotation Processing API”規(guī)范评疗,只要程序實現了該API测砂,就能在javac運行的時候得到調用。

Lombok就是一個實現了"JSR 269 API"的程序百匆。在使用javac的過程中砌些,它產生作用的具體流程如下:

  1. javac對源代碼進行分析,生成一棵抽象語法樹(AST)

  2. javac編譯過程中調用實現了JSR 269的Lombok程序

  3. 此時Lombok就對第一步驟得到的AST進行處理胧华,找到Lombok注解所在類對應的語法樹(AST)寄症,然后修改該語法樹(AST),增加Lombok注解定義的相應樹節(jié)點

  4. javac使用修改后的抽象語法樹(AST)生成字節(jié)碼文件

Lombok注解的使用

POJO類常用注解:

@Getter/@Setter: 作用類上矩动,生成所有成員變量的getter/setter方法有巧;作用于成員變量上,生成該成員變量的getter/setter方法悲没±河可以設定訪問權限及是否懶加載等。

package com.trace;

import lombok.AccessLevel;
import lombok.Getter;
import lombok.Setter;

/**
 * Created by Trace on 2018/5/19.<br/>
 * DESC: 測試類
 */
@SuppressWarnings("unused")
public class TestClass {

    public static void main(String[] args) {

    }


    @Getter(value = AccessLevel.PUBLIC)
    @Setter(value = AccessLevel.PUBLIC)
    public static class Person {
        private String name;
        private int age;
        private boolean friendly;
    }


    public static class Animal {
        private String name;
        private int age;
        @Getter @Setter private boolean funny;
    }
    
}


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

image

編譯后的代碼如下:[這也是傳統(tǒng)Java編程需要編寫的樣板代碼]

//
// Source code recreated from a .class file by IntelliJ IDEA
// (powered by Fernflower decompiler)
//

package com.trace;

public class TestClass {
    public TestClass() {
    }

    public static void main(String[] args) {
    }

    public static class Animal {
        private String name;
        private int age;
        private boolean funny;

        public Animal() {
        }

        public boolean isFunny() {
            return this.funny;
        }

        public void setFunny(boolean funny) {
            this.funny = funny;
        }
    }

    public static class Person {
        private String name;
        private int age;
        private boolean friendly;

        public Person() {
        }

        public String getName() {
            return this.name;
        }

        public int getAge() {
            return this.age;
        }

        public boolean isFriendly() {
            return this.friendly;
        }

        public void setName(String name) {
            this.name = name;
        }

        public void setAge(int age) {
            this.age = age;
        }

        public void setFriendly(boolean friendly) {
            this.friendly = friendly;
        }
    }
}

@ToString:作用于類甜橱,覆蓋默認的toString()方法,可以通過of屬性限定顯示某些字段栈戳,通過exclude屬性排除某些字段岂傲。

image

@EqualsAndHashCode:作用于類,覆蓋默認的equals和hashCode

@NonNull:主要作用于成員變量和參數中子檀,標識不能為空镊掖,否則拋出空指針異常乃戈。

image

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

staticName屬性一旦設定归薛,將采用靜態(tài)方法的方式生成實例谍憔,access屬性可以限定訪問權限。

@NoArgsConstructor:生成無參構造器主籍;

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

@AllArgsConstructor:生成全參構造器。

image

編譯后結果:

public static class Person {
    @NonNull
    private String name;
    private int age;
    private boolean friendly;

    public String toString() {
        return "TestClass.Person(name=" + this.getName() + ", age=" + this.getAge() + ")";
    }

    @NonNull
    public String getName() {
        return this.name;
    }

    public int getAge() {
        return this.age;
    }

    public boolean isFriendly() {
        return this.friendly;
    }

    public void setName(@NonNull String name) {
        if(name == null) {
            throw new NullPointerException("name");
        } else {
            this.name = name;
        }
    }

    public void setAge(int age) {
        this.age = age;
    }

    public void setFriendly(boolean friendly) {
        this.friendly = friendly;
    }

    private Person() {
    }

    private static TestClass.Person of() {
        return new TestClass.Person();
    }

    @ConstructorProperties({"name"})
    Person(@NonNull String name) {
        if(name == null) {
            throw new NullPointerException("name");
        } else {
            this.name = name;
        }
    }

    @ConstructorProperties({"name", "age", "friendly"})
    public Person(@NonNull String name, int age, boolean friendly) {
        if(name == null) {
            throw new NullPointerException("name");
        } else {
            this.name = name;
            this.age = age;
            this.friendly = friendly;
        }
    }
}


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

@Builder:作用于類上沈条,將類轉變?yōu)榻ㄔ煺吣J?/p>

@Log:作用于類上,生成日志變量诅炉。針對不同的日志實現產品蜡歹,有不同的注解:

image

其他重要注解:

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

image

編譯后結果如下:

image

是不是簡潔了太多月而。

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

image

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

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末瞻凤,一起剝皮案震驚了整個濱河市憨攒,隨后出現的幾起案子,更是在濱河造成了極大的恐慌阀参,老刑警劉巖肝集,帶你破解...
    沈念sama閱讀 218,607評論 6 507
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異蛛壳,居然都是意外死亡杏瞻,警方通過查閱死者的電腦和手機,發(fā)現死者居然都...
    沈念sama閱讀 93,239評論 3 395
  • 文/潘曉璐 我一進店門衙荐,熙熙樓的掌柜王于貴愁眉苦臉地迎上來捞挥,“玉大人,你說我怎么就攤上這事忧吟∑龊” “怎么了?”我有些...
    開封第一講書人閱讀 164,960評論 0 355
  • 文/不壞的土叔 我叫張陵溜族,是天一觀的道長讹俊。 經常有香客問我雏掠,道長,這世上最難降的妖魔是什么劣像? 我笑而不...
    開封第一講書人閱讀 58,750評論 1 294
  • 正文 為了忘掉前任,我火速辦了婚禮摧玫,結果婚禮上耳奕,老公的妹妹穿的比我還像新娘。我一直安慰自己诬像,他們只是感情好屋群,可當我...
    茶點故事閱讀 67,764評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著坏挠,像睡著了一般芍躏。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上降狠,一...
    開封第一講書人閱讀 51,604評論 1 305
  • 那天对竣,我揣著相機與錄音,去河邊找鬼榜配。 笑死否纬,一個胖子當著我的面吹牛,可吹牛的內容都是我干的蛋褥。 我是一名探鬼主播临燃,決...
    沈念sama閱讀 40,347評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烙心!你這毒婦竟也來了膜廊?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,253評論 0 276
  • 序言:老撾萬榮一對情侶失蹤淫茵,失蹤者是張志新(化名)和其女友劉穎爪瓜,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體匙瘪,經...
    沈念sama閱讀 45,702評論 1 315
  • 正文 獨居荒郊野嶺守林人離奇死亡钥勋,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,893評論 3 336
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了辆苔。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片算灸。...
    茶點故事閱讀 40,015評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖驻啤,靈堂內的尸體忽然破棺而出菲驴,到底是詐尸還是另有隱情,我是刑警寧澤骑冗,帶...
    沈念sama閱讀 35,734評論 5 346
  • 正文 年R本政府宣布赊瞬,位于F島的核電站先煎,受9級特大地震影響,放射性物質發(fā)生泄漏巧涧。R本人自食惡果不足惜薯蝎,卻給世界環(huán)境...
    茶點故事閱讀 41,352評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望谤绳。 院中可真熱鬧占锯,春花似錦、人聲如沸缩筛。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,934評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽瞎抛。三九已至艺演,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間桐臊,已是汗流浹背胎撤。 一陣腳步聲響...
    開封第一講書人閱讀 33,052評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留断凶,地道東北人哩照。 一個月前我還...
    沈念sama閱讀 48,216評論 3 371
  • 正文 我出身青樓,卻偏偏與公主長得像懒浮,于是被迫代替她去往敵國和親飘弧。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,969評論 2 355

推薦閱讀更多精彩內容