lombok guide

lombok guide

lombok是什么

lombok是一款用于減少重復(fù)代碼(或模板類代碼)的開源框架。
相信大家都用過jdbc操作數(shù)據(jù)庫,過程很麻煩胧砰,而且千篇一律……
同理舅世,項目中最常見的代碼set/get旦委、toString、equals雏亚、hashCode缨硝、Logger……

lombok怎么用

這里不談原理,不講性能罢低,只談使用查辩。

這里只說比較常用的胖笛,其他偏門的查API

lombok內(nèi)置很多注解,這些注解可以幫我們減少重復(fù)代碼

@Getter宜岛、@Setter
@Getter @Setter private boolean employed = true;
@Setter(AccessLevel.PROTECTED) private String name;

------------------------------------------------------

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;
}

分隔線上是lombok注解的使用例子长踊,分割線下是lombok為我們生成的或者我們以前就是那么干的

@NonNull
public class Family{
    @Getter @Setter @NonNull
    private List<Person> members;
}

------------------------------------------------------

@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;
}

public void setMembers(@NonNull final List<Person> members) {
    if (members == null) throw new java.lang.NullPointerException("members");
    this.members = members;
}

非null校驗

@ToString
@ToString(callSuper=true,exclude="someExcludedField")
public class Foo extends Bar {
    private boolean someBoolean = true;
    private String someStringField;
    private float someExcludedField;
}

------------------------------------------------------

public class Foo extends Bar {
    private boolean someBoolean = true;
    private String someStringField;
    private float someExcludedField;

    @java.lang.Override
    public java.lang.String toString() {
        return "Foo(super=" + super.toString() +
            ", someBoolean=" + someBoolean +
            ", someStringField=" + someStringField + ")";
    }
}

toString,可以排除某個字段萍倡,其他的可以看API

@EqualsAndHashCode
@EqualsAndHashCode(callSuper=true,exclude={"address","city","state","zip"})
public class Person extends SentientBeing {
    enum Gender { Male, Female }

    @NonNull private String name;
    @NonNull private Gender gender;

    private String ssn;
    private String address;
    private String city;
    private String state;
    private String zip;
}

------------------------------------------------------

public class Person extends SentientBeing {

    enum Gender {
        /*public static final*/ Male /* = new Gender() */,
        /*public static final*/ Female /* = new Gender() */;
    }
    @NonNull
    private String name;
    @NonNull
    private Gender gender;
    private String ssn;
    private String address;
    private String city;
    private String state;
    private String zip;

    @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;
        if (!super.equals(o)) return false;
        final Person other = (Person)o;
        if (this.name == null ? other.name != null : !this.name.equals(other.name)) return false;
        if (this.gender == null ? other.gender != null : !this.gender.equals(other.gender)) return false;
        if (this.ssn == null ? other.ssn != null : !this.ssn.equals(other.ssn)) return false;
        return true;
    }

    @java.lang.Override
    public int hashCode() {
        final int PRIME = 31;
        int result = 1;
        result = result * PRIME + super.hashCode();
        result = result * PRIME + (this.name == null ? 0 : this.name.hashCode());
        result = result * PRIME + (this.gender == null ? 0 : this.gender.hashCode());
        result = result * PRIME + (this.ssn == null ? 0 : this.ssn.hashCode());
        return result;
    }
}

同樣可以exclude特定字段

@Data

@Data是lombok的工具集身弊,包含了@ToString、@EqualsAndHashCode列敲、@Getter和@Setter

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

------------------------------------------------------

public class Company {
    private final Person founder;
    private String name;
    private List<Person> employees;

    private Company(final Person founder) {
        this.founder = founder;
    }

    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 + ")";
    }
}

@NoArgsConstructor阱佛、@AllArgsConstructor

無參構(gòu)造和全參構(gòu)造

@Builder
 @Builder
 class Example {
        private int foo;
        private final String bar;
 }

 ------------------------------------------------------

 class Example<T> {
        private T foo;
        private final String bar;

        private Example(T foo, String bar) {
                this.foo = foo;
                this.bar = bar;
        }

        public static <T> ExampleBuilder<T> builder() {
                return new ExampleBuilder<T>();
        }

        public static class ExampleBuilder<T> {
                private T foo;
                private String bar;

                private ExampleBuilder() {}

                public ExampleBuilder foo(T foo) {
                        this.foo = foo;
                        return this;
                }

                public ExampleBuilder bar(String bar) {
                        this.bar = bar;
                        return this;
                }

                @java.lang.Override public String toString() {
                        return "ExampleBuilder(foo = " + foo + ", bar = " + bar + ")";
                }

                public Example build() {
                        return new Example(foo, bar);
                }
        }
 }

builder模式需要注意一點,因為builder生成的構(gòu)造是private的戴而,會引起一些框架的反射裝配問題凑术,所以一般與@ NoArgsConstructor一起使用

各種日志

包括apache、jdk logging所意、jboss log淮逊、log4j、slf4j扶踊。這里只講@Slf4j

@Slf4j
public class LogExample {
}

------------------------------------------------------

public class LogExample {
    private static final org.slf4j.Logger log = org.slf4j.LoggerFactory.getLogger(LogExample.class);
}  

利與弊

使用任何框架都有兩面性

利:
1.減少重復(fù)代碼
2.減少維護成本壮莹、增強可讀性、減少基礎(chǔ)性bug

弊:
1.降低性能
2.其他
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末姻檀,一起剝皮案震驚了整個濱河市命满,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌绣版,老刑警劉巖胶台,帶你破解...
    沈念sama閱讀 216,651評論 6 501
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現(xiàn)場離奇詭異杂抽,居然都是意外死亡诈唬,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 92,468評論 3 392
  • 文/潘曉璐 我一進店門缩麸,熙熙樓的掌柜王于貴愁眉苦臉地迎上來铸磅,“玉大人,你說我怎么就攤上這事杭朱≡淖校” “怎么了?”我有些...
    開封第一講書人閱讀 162,931評論 0 353
  • 文/不壞的土叔 我叫張陵弧械,是天一觀的道長八酒。 經(jīng)常有香客問我,道長刃唐,這世上最難降的妖魔是什么羞迷? 我笑而不...
    開封第一講書人閱讀 58,218評論 1 292
  • 正文 為了忘掉前任界轩,我火速辦了婚禮,結(jié)果婚禮上衔瓮,老公的妹妹穿的比我還像新娘浊猾。我一直安慰自己,他們只是感情好热鞍,可當我...
    茶點故事閱讀 67,234評論 6 388
  • 文/花漫 我一把揭開白布葫慎。 她就那樣靜靜地躺著,像睡著了一般碍现。 火紅的嫁衣襯著肌膚如雪幅疼。 梳的紋絲不亂的頭發(fā)上米奸,一...
    開封第一講書人閱讀 51,198評論 1 299
  • 那天昼接,我揣著相機與錄音,去河邊找鬼悴晰。 笑死慢睡,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的铡溪。 我是一名探鬼主播漂辐,決...
    沈念sama閱讀 40,084評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼棕硫!你這毒婦竟也來了髓涯?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 38,926評論 0 274
  • 序言:老撾萬榮一對情侶失蹤哈扮,失蹤者是張志新(化名)和其女友劉穎纬纪,沒想到半個月后,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體滑肉,經(jīng)...
    沈念sama閱讀 45,341評論 1 311
  • 正文 獨居荒郊野嶺守林人離奇死亡包各,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,563評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現(xiàn)自己被綠了靶庙。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片问畅。...
    茶點故事閱讀 39,731評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡,死狀恐怖六荒,靈堂內(nèi)的尸體忽然破棺而出护姆,到底是詐尸還是另有隱情,我是刑警寧澤掏击,帶...
    沈念sama閱讀 35,430評論 5 343
  • 正文 年R本政府宣布签则,位于F島的核電站,受9級特大地震影響铐料,放射性物質(zhì)發(fā)生泄漏渐裂。R本人自食惡果不足惜豺旬,卻給世界環(huán)境...
    茶點故事閱讀 41,036評論 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望柒凉。 院中可真熱鬧族阅,春花似錦、人聲如沸膝捞。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,676評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽蔬咬。三九已至鲤遥,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間林艘,已是汗流浹背盖奈。 一陣腳步聲響...
    開封第一講書人閱讀 32,829評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留狐援,地道東北人钢坦。 一個月前我還...
    沈念sama閱讀 47,743評論 2 368
  • 正文 我出身青樓,卻偏偏與公主長得像啥酱,于是被迫代替她去往敵國和親爹凹。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,629評論 2 354

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

  • Spring Cloud為開發(fā)人員提供了快速構(gòu)建分布式系統(tǒng)中一些常見模式的工具(例如配置管理镶殷,服務(wù)發(fā)現(xiàn)禾酱,斷路器,智...
    卡卡羅2017閱讀 134,652評論 18 139
  • 1. Java基礎(chǔ)部分 基礎(chǔ)部分的順序:基本語法绘趋,類相關(guān)的語法颤陶,內(nèi)部類的語法,繼承相關(guān)的語法埋心,異常的語法指郁,線程的語...
    子非魚_t_閱讀 31,623評論 18 399
  • 廢話不多說,自己進入今天的主題 1拷呆、面向?qū)ο蟮奶卣饔心男┓矫妫?答:面向?qū)ο蟮奶卣髦饕幸韵聨讉€方面: - 抽象:...
    傳奇內(nèi)服號閱讀 2,349評論 1 31
  • 創(chuàng)新是企業(yè)行動方案中始終要堅持的不二法則闲坎。摘自 陳春花《經(jīng)營的本質(zhì)》
    靜如癱瘓_動若癲癇閱讀 148評論 0 0
  • 當我看到五莊觀的牌匾的時候,我不禁激動得嗷嗷叫了起來茬斧。 問我為啥激動腰懂? 因為這兒有一種叫人參果的東西,這人參果又名...
    御風如水閱讀 846評論 2 7