Lombok 完整示例 2021-11-16

Lombok

lombok install

maven install

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

jdk9

<annotationProcessorPaths>
    <path>
        <groupId>org.projectlombok</groupId>
        <artifactId>lombok</artifactId>
        <version>1.18.22</version>
    </path>
</annotationProcessorPaths>

IntelliJ IDEA install

從 2020.3 版本開始泰讽,Jetbrains IntelliJ IDEA 編輯器與 lombok 兼容斧蜕,無需插件叫确。 對于 2020.3 之前的版本惨驶,可以添加 Lombok IntelliJ 插件奥吩,為 IntelliJ 添加 lombok 支持:

  • Go to File > Settings > Plugins
  • Click on Browse repositories...
  • Search for Lombok Plugin
  • Click on Install plugin
  • Restart IntelliJ IDEA

您還可以查看使用 Eclipse 和 IntelliJ 設(shè)置 Lombok铐料,這是一篇關(guān)于 baeldung 的博客文章吨枉。

other install

更多參考:lombok other install

lombok features

lombok 功能示例來源lombok官方文檔中的示例混埠,具體使用的細節(jié)請查看官方使用說明揍堰,此倉庫示例僅個人預(yù)研使用鹏浅。
代碼倉庫地址 springboot-lombok-features

@Data

現(xiàn)在一起:@ToString、@EqualsAndHashCode屏歹、@Getter 在所有字段上隐砸、@Setter 在所有非final最終字段上的快捷方式,以及@RequiredArgsConstructor蝙眶!

Lombok
@Data
public class DataExample {
    private final String name;
    @Setter(AccessLevel.PACKAGE)
    private int age;
    private double score;
    private String[] tags;

    @ToString(includeFieldNames = true)
    @Data(staticConstructor = "of")
    public static class Exercise<T> {
        private final String name;
        private final T value;
    }
}
java
public class DataExample {
    private final String name;
    private int age;
    private double score;
    private String[] tags;

    public DataExample(String name) {
        this.name = name;
    }

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

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

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

    public void setScore(double score) {
        this.score = score;
    }

    public double getScore() {
        return this.score;
    }

    public String[] getTags() {
        return this.tags;
    }

    public void setTags(String[] tags) {
        this.tags = tags;
    }

    @Override
    public String toString() {
        return "DataExampleJava(" + this.getName() + ", " + this.getAge() + ", " + this.getScore() + ", " + Arrays.deepToString(this.getTags()) + ")";
    }

    protected boolean canEqual(Object other) {
        return other instanceof DataExample;
    }

    @Override
    public boolean equals(Object o) {
        if (o == this) return true;
        if (!(o instanceof DataExample)) return false;
        DataExample other = (DataExample) o;
        if (!other.canEqual((Object) this)) return false;
        if (this.getName() == null ? other.getName() != null : !this.getName().equals(other.getName())) return false;
        if (this.getAge() != other.getAge()) return false;
        if (Double.compare(this.getScore(), other.getScore()) != 0) return false;
        if (!Arrays.deepEquals(this.getTags(), other.getTags())) return false;
        return true;
    }

    @Override
    public int hashCode() {
        final int PRIME = 59;
        int result = 1;
        final long temp1 = Double.doubleToLongBits(this.getScore());
        result = (result * PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
        result = (result * PRIME) + this.getAge();
        result = (result * PRIME) + (int) (temp1 ^ (temp1 >>> 32));
        result = (result * PRIME) + Arrays.deepHashCode(this.getTags());
        return result;
    }

    public static class Exercise<T> {
        private final String name;
        private final T value;

        private Exercise(String name, T value) {
            this.name = name;
            this.value = value;
        }

        public static <T> Exercise<T> of(String name, T value) {
            return new Exercise<T>(name, value);
        }

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

        public T getValue() {
            return this.value;
        }

        @Override
        public String toString() {
            return "Exercise(name=" + this.getName() + ", value=" + this.getValue() + ")";
        }

        protected boolean canEqual(Object other) {
            return other instanceof Exercise;
        }

        @Override
        public boolean equals(Object o) {
            if (o == this) return true;
            if (!(o instanceof Exercise)) return false;
            Exercise<?> other = (Exercise<?>) o;
            if (!other.canEqual((Object) this)) return false;
            if (this.getName() == null ? other.getValue() != null : !this.getName().equals(other.getName()))
                return false;
            if (this.getValue() == null ? other.getValue() != null : !this.getValue().equals(other.getValue()))
                return false;
            return true;
        }

        @Override
        public int hashCode() {
            final int PRIME = 59;
            int result = 1;
            result = (result * PRIME) + (this.getName() == null ? 43 : this.getName().hashCode());
            result = (result * PRIME) + (this.getValue() == null ? 43 : this.getValue().hashCode());
            return result;
        }
    }
}

@Getter/@Setter

永遠不要再寫 public String getName() {return name;}

Lombok
public class GetterSetterExample {
    @Getter
    @Setter
    private int age = 10;
    @Setter(AccessLevel.PROTECTED)
    private String name;

    @Override
    public String toString() {
        return String.format("%s (age: %d)", name, age);
    }
}
java
public class GetterSetterExample {
    private int age = 10;
    private String name;

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    protected void setName(String name) {
        this.name = name;
    }

    @Override
    public String toString() {
        return String.format("%s (age: %d)", name, age);
    }
}

@Builder

用于創(chuàng)建對象的無障礙花哨 API

Lombok
@Builder
public class BuilderExample {
    @Builder.Default
    private long created = System.currentTimeMillis();
    private String name;
    private int age;
    @Singular
    private Set<String> occupations;
}
java
public class BuilderExample {
    private long created;
    private String name;
    private int age;
    private Set<String> occupations;

    BuilderExample(String name, int age, Set<String> occupations) {
        this.name = name;
        this.age = age;
        this.occupations = occupations;
    }

    private static long $default$created() {
        return System.currentTimeMillis();
    }

    public static BuilderExampleBuilder builder() {
        return new BuilderExampleBuilder();
    }

    public static class BuilderExampleBuilder {
        private long created;
        private boolean created$set;
        private String name;
        private int age;
        private java.util.ArrayList<String> occupations;

        BuilderExampleBuilder() {
        }

        public BuilderExampleBuilder created(long created) {
            this.created = created;
            this.created$set = true;
            return this;
        }

        public BuilderExampleBuilder name(String name) {
            this.name = name;
            return this;
        }

        public BuilderExampleBuilder age(int age) {
            this.age = age;
            return this;
        }

        public BuilderExampleBuilder occupation(String occupation) {
            if (this.occupations == null) {
                this.occupations = new java.util.ArrayList<String>();
            }

            this.occupations.add(occupation);
            return this;
        }

        public BuilderExampleBuilder occupations(Collection<? extends String> occupations) {
            if (this.occupations == null) {
                this.occupations = new java.util.ArrayList<String>();
            }

            this.occupations.addAll(occupations);
            return this;
        }

        public BuilderExampleBuilder clearOccupations() {
            if (this.occupations != null) {
                this.occupations.clear();
            }

            return this;
        }

        public BuilderExample build() {
            Set<String> occupations = new HashSet<>();
            return new BuilderExample(name, age, occupations);
        }

        @java.lang.Override
        public String toString() {
            return "BuilderExample.BuilderExampleBuilder(created = " + this.created + ", name = " + this.name + ", age = " + this.age + ", occupations = " + this.occupations + ")";
        }
    }

@NonNull

學(xué)會停止擔(dān)心并喜歡 NullPointerException

Lombok
public class NonNullExample extends Something {
    private String name;

    public NonNullExample(@NonNull Person person) {
        super("Hello");
        this.name = person.getName();
    }
}
java
public class NonNullExample extends Something {
    private String name;

    public NonNullExample(Person person) {
        super("Hello");
        if (person == null) {
            throw new NullPointerException("person is marked @NonNull but is null");
        }
        this.name = person.getName();
    }
}

由于字?jǐn)?shù)限制季希,更多用法,參考代碼倉庫示例幽纷。

完整示例:

.
|-- BuilderExample.java
|-- CleanupExample.java
|-- ConstructorExample.java
|-- DataExample.java
|-- EqualsAndHashCodeExample.java
|-- GetterLazyExample.java
|-- GetterSetterExample.java
|-- LogExample.java
|-- LogExampleCategory.java
|-- LogExampleOther.java
|-- LombokFeaturesApplication.java
|-- NonNullExample.java
|-- SneakyThrowsExample.java
|-- SynchronizedExample.java
|-- ToStringExample.java
|-- ValExample.java
|-- ValueExample.java
|-- WithExample.java
|-- base
|   |-- Person.java
|   |-- Shape.java
|   `-- Something.java
`-- java
    |-- BuilderExample.java
    |-- CleanupExample.java
    |-- ConstructorExample.java
    |-- DataExample.java
    |-- EqualsAndHashCodeExample.java
    |-- GetterLazyExample.java
    |-- GetterSetterExample.java
    |-- LogExample.java
    |-- LogExampleCategory.java
    |-- LogExampleOther.java
    |-- NonNullExample.java
    |-- SneakyThrowsExample.java
    |-- SynchronizedExample.java
    |-- ToStringExample.java
    |-- ValExample.java
    |-- ValueExample.java
    `-- WithExample.java
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末式塌,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子霹崎,更是在濱河造成了極大的恐慌珊搀,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,311評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件尾菇,死亡現(xiàn)場離奇詭異境析,居然都是意外死亡,警方通過查閱死者的電腦和手機派诬,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,339評論 2 382
  • 文/潘曉璐 我一進店門劳淆,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人默赂,你說我怎么就攤上這事沛鸵。” “怎么了缆八?”我有些...
    開封第一講書人閱讀 152,671評論 0 342
  • 文/不壞的土叔 我叫張陵曲掰,是天一觀的道長。 經(jīng)常有香客問我奈辰,道長栏妖,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 55,252評論 1 279
  • 正文 為了忘掉前任奖恰,我火速辦了婚禮吊趾,結(jié)果婚禮上宛裕,老公的妹妹穿的比我還像新娘。我一直安慰自己论泛,他們只是感情好揩尸,可當(dāng)我...
    茶點故事閱讀 64,253評論 5 371
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著屁奏,像睡著了一般岩榆。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上了袁,一...
    開封第一講書人閱讀 49,031評論 1 285
  • 那天朗恳,我揣著相機與錄音,去河邊找鬼载绿。 笑死,一個胖子當(dāng)著我的面吹牛油航,可吹牛的內(nèi)容都是我干的崭庸。 我是一名探鬼主播,決...
    沈念sama閱讀 38,340評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼谊囚,長吁一口氣:“原來是場噩夢啊……” “哼怕享!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起镰踏,我...
    開封第一講書人閱讀 36,973評論 0 259
  • 序言:老撾萬榮一對情侶失蹤函筋,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后奠伪,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體跌帐,經(jīng)...
    沈念sama閱讀 43,466評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,937評論 2 323
  • 正文 我和宋清朗相戀三年绊率,在試婚紗的時候發(fā)現(xiàn)自己被綠了谨敛。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,039評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡滤否,死狀恐怖脸狸,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情藐俺,我是刑警寧澤炊甲,帶...
    沈念sama閱讀 33,701評論 4 323
  • 正文 年R本政府宣布,位于F島的核電站欲芹,受9級特大地震影響卿啡,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜耀石,卻給世界環(huán)境...
    茶點故事閱讀 39,254評論 3 307
  • 文/蒙蒙 一牵囤、第九天 我趴在偏房一處隱蔽的房頂上張望爸黄。 院中可真熱鬧,春花似錦揭鳞、人聲如沸炕贵。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,259評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽称开。三九已至,卻和暖如春乓梨,著一層夾襖步出監(jiān)牢的瞬間鳖轰,已是汗流浹背。 一陣腳步聲響...
    開封第一講書人閱讀 31,485評論 1 262
  • 我被黑心中介騙來泰國打工扶镀, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留蕴侣,地道東北人。 一個月前我還...
    沈念sama閱讀 45,497評論 2 354
  • 正文 我出身青樓臭觉,卻偏偏與公主長得像昆雀,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子蝠筑,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,786評論 2 345