Spring Boot利用Lombok減少Java中樣板代碼的方法示例
前言
Lombok想要解決了的是在我們實體Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不會用到,但是某些時候仍然需要復(fù)寫,以期方便使用的方法;在使用Lombok之后,將由其來自動幫你實現(xiàn)代碼生成,注意,其是在運行過程中,幫你自動生成的。就是說,將極大減少你的代碼總量。
Lombok的官方地址: https://projectlombok.org/
其實說實話第一次聽到Lombok的時候,是從一個帶我的匈牙利老師傅那里學(xué)來的。那個時候他給了我一套JPA的代碼來訪問數(shù)據(jù)庫。 當(dāng)我打開代碼的時候,看到滿屏幕的錯誤,打開實體Entity類一看,就一些成員變量的定義,完全沒有setter 與getter的方法。 當(dāng)時我就凌亂了,這什么啊。 后來當(dāng)他告訴我 去查查lombok我才恍然大悟。
其實對于Java來說我一直都是愛與恨相互糾結(jié)。 一方面,Java確實是一種非常成熟的編程語言,具體很多開源的框架跟庫,使得開發(fā)相對來說比較容易。 但是另一方面,它是非常冗長的, 因為需要編寫大量的常用的樣板代碼。 雖然說在Java8中引入了 Lambdas 跟 stream, 情況變得相對來說好了一些, 但是在某一些方面仍然存在一些差異, 比如編寫簡單的Java對象Pojo,但是現(xiàn)在有了Lombok這個插件,你會發(fā)現(xiàn)我們寫代碼到底可以多輕松。 因為許多常用的方法像 Setter, getter, toString, equal等等 甚至 構(gòu)造器 都已經(jīng)幫你完成了,我們所需要做的就只是在對的地方添加上注解標(biāo)記就好了。
方法如下:
首先我們來看看傳統(tǒng)的 Java POJO類 應(yīng)該來怎么定義:
public class User { private String name; private String surname; private int age; public User(String name, String surname, int age) { this.name = name; this.surname = surname; this.age = age; } public String getName() { return name; } public void setName(String name) { this.name = name; } public String getSurname() { return surname; } public void setSurname(String surname) { this.surname = surname; } public int getAge() { return age; } public void setAge(int age) { this.age = age; } @Override public boolean equals(Object o) { if (this == o) return true; if (o == null || getClass() != o.getClass()) return false; User user = (User) o; return age == user.age && Objects.equals(name, user.name) && Objects.equals(surname, user.surname); } @Override public int hashCode() { return Objects.hash(name, surname, age); } @Override public String toString() { return "User{" + "name='" + name + '\'' + ", surname='" + surname + '\'' + ", age=" + age + '}'; } }
在這個常規(guī)的POJO類中只有三個成員字段, name, surname 和 age。但是它具有常見的POJO類的一切通用元素: getters,** setters, equals, hashCode, 和toString** 方法.
為了完成這個僅僅只有三個成員變量的類,我們竟然寫了差不多60行的diamante。 確實,如果你使用IDE的話,IDE確實可以幫你自動生成一些方法的實現(xiàn),但是在閱讀代碼的看到這些代碼你難道不覺得頭疼么。 下面我們通過使用Lombok來簡化我們的代碼。
首先在項目中添加Lombok的依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> <scope>provided</scope> </dependency>
通常情況下在,如果你使用IDE例如Intellji后者Eclipse,你還需要裝上 Lombok的Plugin才能正確使用。 Lombok為成員變量提供了一些基本的注解來確保每一個成員變量都能夠自動擁有訪問的方法。
@EqualsAndHashCode @ToString @AllArgsConstructor public class User { @Setter @Getter private String name; @Setter @Getter private String surname; @Setter @Getter private int age; }
正如你所見的,我們使用了五個基本的注解。
@EqualsAndHashCode, @ToString 告訴Lombok來生成 equals, hashCode, 和 toString 方法, 在生成這些方法的時候lombok會使用所有的成員變量。 @AllArgsConstructor會自動創(chuàng)建一個包括所有成員的構(gòu)造器。 @Getter/@Setter annotations 注解會為每一個標(biāo)記的成員變量自動生成對應(yīng)的方法。
現(xiàn)在我們只需要像這個正常使用它就好了
User user = new User("John", "Doe", 32); user.setAge(30); user.equals(new User("John", "Doe", 30)); // true
如果你不想將注解用在全部的成員變量上,而是僅僅部分變量上,那么你可以提供一個指定的哪一個成員變量需要自動生成方法的變量。 比如在這里,我們不想讓 age 這個成員變量出現(xiàn)在 toString 方法里,我們可以這么做:
@EqualsAndHashCode @ToString(of = {"name", "surname"}) @AllArgsConstructor public class User { @Getter @Setter private String name; @Getter @Setter private String surname; @Getter @Setter private int age; }
我想到這里,這些代碼已經(jīng)比我們一開始要好太多了,但是它任然不夠簡潔。這里重復(fù)了大量的 @Getter 和 @Setter 注解。如果你只是需要在Class中僅暴露幾個字段,那么使用它們非常方便,但如果您需要為所有字段生成訪問器,則會變得煩人又無聊。為了使代碼更加簡潔, Lombok永續(xù)我們在類級上使用這些注解。如果這些注解放在類名之上,那么lombok會自動為我們生成所有字段的訪問方法。
@EqualsAndHashCode @ToString @AllArgsConstructor @Getter @Setter public class User { private String name; private String surname; private int age; }
目前為止我們所做的修改并沒有改變類的行為,但是卻使我們的類看起來更加的簡潔。這就是我們使用Lombok想要達(dá)到的效果。
除此之外Lombok還有一個注解叫做 @Builder。 下面我們來看一段這樣的代碼:
@EqualsAndHashCode @ToString @AllArgsConstructor @Getter @Setter @Builder public class User { private String name; private String surname; private int age; }
我們給User這個類加了一個@Builder的注解,下面我們?nèi)绻雽嵗@個類,你第一想到的是不是:
User user=new User; user.setxxx(); .... ....
但是現(xiàn)在我們可以利用@Builder注解這樣生成實例:
User user = User.builder() .name("John") .surname("Doe") .age(32) .build();
怎么樣,是不是很方便,這樣你在生成實例的時候來呢setter方法都省得寫了。
其實說了這么說,下面這個注解才是Lombok的精華:
簡單的來說所有所有的注解我們都可以使用一個注解完成。 對 他就是@Data 注解。
@Data @Builder public class User { private String name; private String surname; private int age; }
我們在定義類的時候 只需要加一個 @Data 注解,其他的注解我們都不需要在添加就可以達(dá)到前面所說的所有功能。 不相信的想伙伴可以試一試
總結(jié)
以上就是這篇文章的全部內(nèi)容了,希望本文的內(nèi)容對大家的學(xué)習(xí)或者工作能帶來一定的幫助,如果有疑問大家可以留言交流,謝謝大家對腳本之家的支持。
相關(guān)文章
SpringBoot+Redis?BitMap實現(xiàn)簽到與統(tǒng)計的項目實踐
最近項目里需要集成簽到和統(tǒng)計功能,連續(xù)簽到后會給用戶發(fā)放一些優(yōu)惠券和獎品,以此來吸引用戶持續(xù)在該品臺進(jìn)行活躍,本文就詳細(xì)的介紹一下如何實現(xiàn),感興趣的可以了解一下2023-09-09Spring注解驅(qū)動之關(guān)于@Bean注解指定初始化和銷毀的方法
這篇文章主要介紹了Spring注解驅(qū)動之關(guān)于@Bean注解指定初始化和銷毀的方法,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-09-09Swing中依據(jù)鼠標(biāo)拖拽來畫出矩形的實現(xiàn)方法
這篇文章主要介紹了Swing中依據(jù)鼠標(biāo)拖拽來畫出矩形的實現(xiàn)方法,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Spring Cloud Gateway內(nèi)置的斷言和過濾器作用說明
這篇文章主要介紹了Spring Cloud Gateway內(nèi)置的斷言和過濾器作用說明,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06SpringBoot2整合activiti6環(huán)境搭建過程解析
這篇文章主要介紹了SpringBoot2整合activiti6環(huán)境搭建過程解析,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2019-11-11