Spring Boot利用Lombok減少Java中樣板代碼的方法示例
前言
Lombok想要解決了的是在我們實(shí)體Bean中大量的Getter/Setter方法,以及toString, hashCode等可能不會(huì)用到,但是某些時(shí)候仍然需要復(fù)寫(xiě),以期方便使用的方法;在使用Lombok之后,將由其來(lái)自動(dòng)幫你實(shí)現(xiàn)代碼生成,注意,其是在運(yùn)行過(guò)程中,幫你自動(dòng)生成的。就是說(shuō),將極大減少你的代碼總量。
Lombok的官方地址: https://projectlombok.org/
其實(shí)說(shuō)實(shí)話第一次聽(tīng)到Lombok的時(shí)候,是從一個(gè)帶我的匈牙利老師傅那里學(xué)來(lái)的。那個(gè)時(shí)候他給了我一套JPA的代碼來(lái)訪問(wèn)數(shù)據(jù)庫(kù)。 當(dāng)我打開(kāi)代碼的時(shí)候,看到滿屏幕的錯(cuò)誤,打開(kāi)實(shí)體Entity類一看,就一些成員變量的定義,完全沒(méi)有setter 與getter的方法。 當(dāng)時(shí)我就凌亂了,這什么啊。 后來(lái)當(dāng)他告訴我 去查查lombok我才恍然大悟。
其實(shí)對(duì)于Java來(lái)說(shuō)我一直都是愛(ài)與恨相互糾結(jié)。 一方面,Java確實(shí)是一種非常成熟的編程語(yǔ)言,具體很多開(kāi)源的框架跟庫(kù),使得開(kāi)發(fā)相對(duì)來(lái)說(shuō)比較容易。 但是另一方面,它是非常冗長(zhǎng)的, 因?yàn)樾枰帉?xiě)大量的常用的樣板代碼。 雖然說(shuō)在Java8中引入了 Lambdas 跟 stream, 情況變得相對(duì)來(lái)說(shuō)好了一些, 但是在某一些方面仍然存在一些差異, 比如編寫(xiě)簡(jiǎn)單的Java對(duì)象Pojo,但是現(xiàn)在有了Lombok這個(gè)插件,你會(huì)發(fā)現(xiàn)我們寫(xiě)代碼到底可以多輕松。 因?yàn)樵S多常用的方法像 Setter, getter, toString, equal等等 甚至 構(gòu)造器 都已經(jīng)幫你完成了,我們所需要做的就只是在對(duì)的地方添加上注解標(biāo)記就好了。
方法如下:
首先我們來(lái)看看傳統(tǒng)的 Java POJO類 應(yīng)該來(lái)怎么定義:
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 +
'}';
}
}
在這個(gè)常規(guī)的POJO類中只有三個(gè)成員字段, name, surname 和 age。但是它具有常見(jiàn)的POJO類的一切通用元素: getters,** setters, equals, hashCode, 和toString** 方法.
為了完成這個(gè)僅僅只有三個(gè)成員變量的類,我們竟然寫(xiě)了差不多60行的diamante。 確實(shí),如果你使用IDE的話,IDE確實(shí)可以幫你自動(dòng)生成一些方法的實(shí)現(xiàn),但是在閱讀代碼的看到這些代碼你難道不覺(jué)得頭疼么。 下面我們通過(guò)使用Lombok來(lái)簡(jiǎn)化我們的代碼。
首先在項(xiàng)目中添加Lombok的依賴:
<dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.16.10</version> <scope>provided</scope> </dependency>
通常情況下在,如果你使用IDE例如Intellji后者Eclipse,你還需要裝上 Lombok的Plugin才能正確使用。 Lombok為成員變量提供了一些基本的注解來(lái)確保每一個(gè)成員變量都能夠自動(dòng)擁有訪問(wèn)的方法。
@EqualsAndHashCode
@ToString
@AllArgsConstructor
public class User {
@Setter
@Getter
private String name;
@Setter
@Getter
private String surname;
@Setter
@Getter
private int age;
}
正如你所見(jiàn)的,我們使用了五個(gè)基本的注解。
@EqualsAndHashCode, @ToString 告訴Lombok來(lái)生成 equals, hashCode, 和 toString 方法, 在生成這些方法的時(shí)候lombok會(huì)使用所有的成員變量。 @AllArgsConstructor會(huì)自動(dòng)創(chuàng)建一個(gè)包括所有成員的構(gòu)造器。 @Getter/@Setter annotations 注解會(huì)為每一個(gè)標(biāo)記的成員變量自動(dòng)生成對(duì)應(yīng)的方法。
現(xiàn)在我們只需要像這個(gè)正常使用它就好了
User user = new User("John", "Doe", 32);
user.setAge(30);
user.equals(new User("John", "Doe", 30)); // true
如果你不想將注解用在全部的成員變量上,而是僅僅部分變量上,那么你可以提供一個(gè)指定的哪一個(gè)成員變量需要自動(dòng)生成方法的變量。 比如在這里,我們不想讓 age 這個(gè)成員變量出現(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)比我們一開(kāi)始要好太多了,但是它任然不夠簡(jiǎn)潔。這里重復(fù)了大量的 @Getter 和 @Setter 注解。如果你只是需要在Class中僅暴露幾個(gè)字段,那么使用它們非常方便,但如果您需要為所有字段生成訪問(wèn)器,則會(huì)變得煩人又無(wú)聊。為了使代碼更加簡(jiǎn)潔, Lombok永續(xù)我們?cè)陬惣?jí)上使用這些注解。如果這些注解放在類名之上,那么lombok會(huì)自動(dòng)為我們生成所有字段的訪問(wèn)方法。
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@Getter
@Setter
public class User {
private String name;
private String surname;
private int age;
}
目前為止我們所做的修改并沒(méi)有改變類的行為,但是卻使我們的類看起來(lái)更加的簡(jiǎn)潔。這就是我們使用Lombok想要達(dá)到的效果。
除此之外Lombok還有一個(gè)注解叫做 @Builder。 下面我們來(lái)看一段這樣的代碼:
@EqualsAndHashCode
@ToString
@AllArgsConstructor
@Getter
@Setter
@Builder
public class User {
private String name;
private String surname;
private int age;
}
我們給User這個(gè)類加了一個(gè)@Builder的注解,下面我們?nèi)绻雽?shí)例化這個(gè)類,你第一想到的是不是:
User user=new User; user.setxxx(); .... ....
但是現(xiàn)在我們可以利用@Builder注解這樣生成實(shí)例:
User user = User.builder()
.name("John")
.surname("Doe")
.age(32)
.build();
怎么樣,是不是很方便,這樣你在生成實(shí)例的時(shí)候來(lái)呢setter方法都省得寫(xiě)了。
其實(shí)說(shuō)了這么說(shuō),下面這個(gè)注解才是Lombok的精華:
簡(jiǎn)單的來(lái)說(shuō)所有所有的注解我們都可以使用一個(gè)注解完成。 對(duì) 他就是@Data 注解。
@Data
@Builder
public class User {
private String name;
private String surname;
private int age;
}
我們?cè)诙x類的時(shí)候 只需要加一個(gè) @Data 注解,其他的注解我們都不需要在添加就可以達(dá)到前面所說(shuō)的所有功能。 不相信的想伙伴可以試一試
總結(jié)
以上就是這篇文章的全部?jī)?nèi)容了,希望本文的內(nèi)容對(duì)大家的學(xué)習(xí)或者工作能帶來(lái)一定的幫助,如果有疑問(wèn)大家可以留言交流,謝謝大家對(duì)腳本之家的支持。
相關(guān)文章
Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)
這篇文章主要介紹了Java API如何實(shí)現(xiàn)向Hive批量導(dǎo)入數(shù)據(jù)的操作,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-07-07
Java中LambdaQueryWrapper設(shè)置自定義排序代碼示例
這篇文章主要給大家介紹了關(guān)于Java中LambdaQueryWrapper設(shè)置自定義排序的相關(guān)資料,lambdaquerywrapper是MyBatis-Plus框架中的一個(gè)查詢條件構(gòu)造器,它可以用于構(gòu)建自定義的查詢條件,需要的朋友可以參考下2023-12-12
Spring?Boot項(xiàng)目Jar包加密實(shí)戰(zhàn)教程
本文詳細(xì)介紹了如何在Spring?Boot項(xiàng)目中實(shí)現(xiàn)Jar包加密,我們首先了解了Jar包加密的基本概念和作用,然后學(xué)習(xí)了如何使用Spring?Boot的Jar工具和第三方庫(kù)來(lái)實(shí)現(xiàn)Jar包的加密和解密,感興趣的朋友一起看看吧2024-02-02
JavaWeb項(xiàng)目中JSP訪問(wèn)的問(wèn)題解決
Java計(jì)算兩個(gè)時(shí)間段的差的實(shí)例詳解
Java Quartz觸發(fā)器CronTriggerBean配置用法詳解

