日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

使java代码更干净_java如何使用Lombok更优雅地编码

發布時間:2024/9/27 编程问答 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 使java代码更干净_java如何使用Lombok更优雅地编码 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Lombok簡介

和其他語言相比,Java經常因為不必要的冗長被批評。Lombok提供了一系列注解用以在后臺生成模板代碼,將其從你的類中刪除,從而有助于保持你的代碼整潔。較少的模板意味著更簡潔的代碼,更易于閱讀和維護。在本文中,我將涉及我經常使用的Lombok功能,并想你展示如何使用他們生產更清晰、更簡潔的代碼。

1.局部變量類型推斷:val 和 var

許多語言通過查看等號右側的表達式來推斷局部變量類型。盡管現在Java 10+已經支持這種功能,但在之前的版本中沒有Lombok的幫助就無法實現。下面的代碼段展示了如何顯式指定局部類型:

final Map map = new HashMap<>();

map.put("Joe", 21);

在Lombok中,我們可以通過使用val來縮短它,如下所示:

val valMap = new HashMap();

valMap.put("Sam", 30);

注意,val在背后創建了一個final且不可變的變量。如果你需要一個可變本地變量,可以使用var。

2.@NonNull

對方法參數進行null檢查通常不是一個壞主意,特別是如果該方法形成的API被其他開發者使用。雖然這些檢查很簡單,但是他們可能變得冗長,特別是當你有多個參數時。如下所示,額外的代碼無助于可讀性,并且可能從方法的主要目的分散注意力。

public void nonNullDemo(Employee employee, Account account) {

if(employee == null) {

throw new IllegalArgumentException("Employee is marked @NonNull but is null");

}

if(account == null) {

throw new IllegalArgumentException("Account is marked @NonNull but is null");

}

// do stuff

}

理想情況下,你需要null檢查——沒有干擾的那種。這就是@NonNull發揮作用的地方。通過用@NonNull標記參數,Lombok替你為該參數生成null檢查。你的方法突然變得更加簡潔,但沒有丟失那些安全性的null檢查。

public void nonNullDemo(@NonNull Employee employee, @NonNull Account account) {

// just do stuff

}

默認情況下,Lombok會拋出NullPointerException,如果你愿意,可以配置 Lombok拋出IllegalArgumentException。我個人更喜歡IllegalArgumentException,因為我認為它更適合于對參數檢查。

##3.更簡潔的數據類 數據類是Lombok真正有助于減少模板代碼的領域。在查看該選項前,思考一下我們經常需要處理的模板種類。數據類通常包括以下一種或全部:

構造函數(有或沒有參數)

私有成員變量的 getter 方法

私有非 final 成員變量的 setter 方法

幫助記錄日志的 toString 方法

equals 和 hashCode(處理相等/集合)

可以通過 IDE 生成以上內容,因此問題不在于編寫他們花費的時間。問題是帶有少量成員變量的簡單類很快會變得非常冗長。讓我們看看Lombok如何通過處理上述的每一項來減少混亂。

3.1. @Getter 和 @Setter

想想下面的Car類。當生成getter和setter時,我們會得到接近 50 行代碼來描述一個包含 5 個成員變量的類。

public class Car {

private String make;

private String model;

private String bodyType;

private int yearOfManufacture;

private int cubicCapacity;

public String getMake() {

return make;

}

public void setMake(String make) {

this.make = make;

}

public String getModel() {

return model;

}

public void setModel(String model) {

this.model = model;

}

public String getBodyType() {

return bodyType;

}

public void setBodyType(String bodyType) {

this.bodyType = bodyType;

}

public int getYearOfManufacture() {

return yearOfManufacture;

}

public void setYearOfManufacture(int yearOfManufacture) {

this.yearOfManufacture = yearOfManufacture;

}

public int getCubicCapacity() {

return cubicCapacity;

}

public void setCubicCapacity(int cubicCapacity) {

this.cubicCapacity = cubicCapacity;

}

}

Lombok可以替你生成getter和setter模板。通過對每個成員變量使用 @Getter和@Setter注解,你最終得到一個等效的類,如下所示:

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

}

注意,你可以在非final成員變量上只使用@Setter。在final成員變量上使用它將導致編譯錯誤。

如果你需要為每個成員變量生成getter和setter,你也可以在類級別使用 @Getter和@Setter,如下所示。

@Getter

@Setter

public class Car {

private String make;

private String model;

private String bodyType;

private int yearOfManufacture;

private int cubicCapacity;

}

3.2. @AllArgsConstructor

數據類通常包含一個構造函數,它為每個成員變量接受參數。IDE 為Car生成的構造函數如下所示:

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

public Car(String make, String model, String bodyType, int yearOfManufacture, int cubicCapacity) {

super();

this.make = make;

this.model = model;

this.bodyType = bodyType;

this.yearOfManufacture = yearOfManufacture;

this.cubicCapacity = cubicCapacity;

}

}

我們可以使用@AllArgsConstructor注解實現同樣功能。@Getter和 @Setter、@AllArgsConstructor減少模板,保持類更干凈且更簡潔。

@AllArgsConstructor

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

}

還有其他選項用于生成構造函數。@RequiredArgsConstructor將創建帶有每個 final成員變量參數的構造函數,@NoArgsConstructor將創建沒有參數的構造函數。

3.3. @ToString

在你的數據類上覆蓋toString方法是有助于記錄日志的良好實踐。IDE 為Car類生成的toString方法如下所示:

@AllArgsConstructor

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

@Override

public String toString() {

return "Car [make=" + make + ", model=" + model + ", bodyType=" + bodyType + ", yearOfManufacture="

+ yearOfManufacture + ", cubicCapacity=" + cubicCapacity + "]";

}

}

我們可以使用ToString注解廢除這個,如下所示:

@ToString

@AllArgsConstructor

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

}

默認情況下,Lombok生成包含所有成員變量的toString方法。可以通過 exclude屬性@ToString(exclude={"someField"}, "someOtherField"}) 覆蓋行為將某些成員變量排除。

3.4. @EqualsAndHashCode

如果你正在將你的數據類和任何類型的對象比較,則需要覆蓋equals和hashCode 方法。對象的相等是基于業務規則定義的。舉個例子,在Car類中,如果兩個對象有相同的make、model和bodyType,我可能認為他們是相等的。如果我使用 IDE 生成equals方法檢查make、model和bodyType,它看起來會是這樣:

@Override

public boolean equals(Object obj) {

if (this == obj)

return true;

if (obj == null)

return false;

if (getClass() != obj.getClass())

return false;

Car other = (Car) obj;

if (bodyType == null) {

if (other.bodyType != null)

return false;

} else if (!bodyType.equals(other.bodyType))

return false;

if (make == null) {

if (other.make != null)

return false;

} else if (!make.equals(other.make))

return false;

if (model == null) {

if (other.model != null)

return false;

} else if (!model.equals(other.model))

return false;

return true;

}

等價的hashCode實現如下所示:

@Override

public int hashCode() {

final int prime = 31;

int result = 1;

result = prime * result + ((bodyType == null) ? 0 : bodyType.hashCode());

result = prime * result + ((make == null) ? 0 : make.hashCode());

result = prime * result + ((model == null) ? 0 : model.hashCode());

return result;

}

雖然 IDE 處理了繁重的工作,但我們在類中仍然有大量的模板代碼。Lombok允許我們使用@EqualsAndHashCode類注解實現相同的功能,如下所示:

@ToString

@AllArgsConstructor

@EqualsAndHashCode(exclude = { "yearOfManufacture", "cubicCapacity" })

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

}

默認情況下,@EqualsAndHashCode會創建包含所有成員變量的equals和 hashCode方法。exclude選項可用于通知Lombok排除某些成員變量。

在上面的代碼片段中。我已經從生成的equals和hashCode方法中排除了 yearOfManuFacture 和cubicCapacity。

3.5. @Data

如果你想使數據類盡可能精簡,可以使用@Data注解。@Data 是@Getter、@Setter、@ToString、@EqualsAndHashCode 和 @RequiredArgsConstructor 的快捷方式。

@ToString

@RequiredArgsConstructor

@EqualsAndHashCode(exclude = { "yearOfManufacture", "cubicCapacity" })

public class Car {

@Getter @Setter

private String make;

@Getter @Setter

private String model;

@Getter @Setter

private String bodyType;

@Getter @Setter

private int yearOfManufacture;

@Getter @Setter

private int cubicCapacity;

}

通過使用@Data,我們可以將上面的類精簡如下:

@Data

public class Car {

private String make;

private String model;

private String bodyType;

private int yearOfManufacture;

private int cubicCapacity;

}

4. 使用 @Buidler 創建對象

建造者設計模式描述了一種靈活的創建對象的方式。Lombok可以幫你輕松的實現該模式。看一個使用簡單Car類的示例。假設我們希望可以創建各種Car對象,但我們希望在創建時設置的屬性具有靈活性。

@AllArgsConstructor

public class Car {

private String make;

private String model;

private String bodyType;

private int yearOfManufacture;

private int cubicCapacity;

private List serviceDate;

}

假設我們要創建一個Car,但只想設置make和model。在Car上使用標準的全參數構造函數意味著我們只提供make和model并設置其他參數為null。

Car2 car2 = new Car2("Ford", "Mustang", null, null, null, null);

這可行但并不理想,我們必須為我們不感興趣的參數傳遞null。我們可以創建一個只接受make和model的構造函數來避開這個問題。這是一個合理的解決方法,但不夠靈活。如果我們有許多不同的字段排列,我們可以用什么來創建一個新Car?最終我們得到了一堆不同的構造函數,代表了我們可以實例化Car的所有可能方式。

解決該問題的一種干凈、靈活的方式是使用建造者模式。Lombok通過@Builder 注解幫你實現建造者模式。當你使用@Builder注解Car類時,Lombok會執行以下操作:

添加一個私有構造函數到Car

創建一個靜態的CarBuilder類

在CarBuilder中為Car中的每個成員創建一個setter風格方法。

在CarBuilder中添加創建Car的新實例的建造方法。

CarBuilder上的每個setter風格方法返回自身的實例(CarBuilder)。這允許你進行方法鏈式調用并為對象創建提供流暢的 API。讓我們看看它如何使用。

Car muscleCar = Car.builder().make("Ford")

.model("mustang")

.bodyType("coupe")

.build();

現在只使用make和model創建Car比之前更簡潔了。只需在Car上簡單的調用生成的builder方法獲取CarBuilder實例,然后調用任何我們感興趣的setter風格方法。最后,調用build創建Car的新實例。

另一個值得一提的方便的注解是@Singular。默認情況下,Lombok 為集合創建使用集合參數的標準的 setter 風格方法。在下面的例子中,我們創建了新的 Car并設置了服務日期列表。

Car muscleCar = Car.builder().make("Ford")

.model("mustang")

.serviceDate(Arrays.asList(LocalDate.of(2016, 5, 4)))

.build();

向集合成員變量添加@Singular將提供一個額外的方法,允許你向集合添加單個項。

@Builder

public class Car {

private String make;

private String model;

private String bodyType;

private int yearOfManufacture;

private int cubicCapacity;

@Singular

private List serviceDate;

}

現在我們可以添加單個服務日期,如下所示:

Car muscleCar3 = Car.builder()

.make("Ford")

.model("mustang")

.serviceDate(LocalDate.of(2016, 5, 4))

.build();

這是一個有助于在創建對象期間處理集合時保持代碼簡潔的快捷方法。

5.日志

Lombok另一個偉大的功能是日志記錄器。如果沒有Lombok,要實例化標準的 SLF4J日志記錄器,通常會有以下內容:

public class SomeService {

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

public void doStuff(){

log.debug("doing stuff....");

}

}

這些日志記錄器很沉重,并為每個需要日志記錄的類添加了不必要的混亂。值得慶幸的是 Lombok提供了一個為你創建日志記錄器的注解。你要做的所有事情就是在類上添加注解,這樣就可以了。

@Slf4j

public class SomeService {

public void doStuff(){

log.debug("doing stuff....");

}

}

我在這里使用了@SLF4J注解,但Lombok能為幾乎所有通用Java日志框架生成日志記錄器。有關更多日志記錄器的選項,請參閱文檔。

6.Lombok給你控制權

我非常喜歡Lombok的一點是它的不侵入性。。如果你決定在使用如@Getter、@Setter 或 @ToString時也想要自己的方法實現,你的方法將總是優先于 Lombok。它允許你在大多數時間使用Lombok,但在你需要的時候仍有控制權。

7.寫得更少,做得更多

在過去的 4 到 5 年里,我幾乎在每個項目中都使用了Lombok。我喜歡它,因為它減少了雜亂,最終得到了更干凈、更簡潔、更易閱讀的代碼。它不一定為你節省大量時間,因為它生成的代碼可以由 IDE 自動生成。話雖如此,我認為更干凈的代碼的好處不僅僅是將其添加到Java堆棧中。

8. 延展閱讀

我已經介紹了我經常使用的Lombok功能,但還有很多我沒有講到。如果你喜歡目前為止所看到的,并希望了解更多,請繼續閱讀 Lombok 文檔。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持腳本之家。

總結

以上是生活随笔為你收集整理的使java代码更干净_java如何使用Lombok更优雅地编码的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。

主站蜘蛛池模板: 一区二区三区免费播放 | 浓精h攵女乱爱av | 黄色在线视频网址 | 九九久久网 | 亚洲最大av | 日本xxx在线播放 | 美国av大片 | 中文天堂在线资源 | 孕妇爱爱视频 | 91天天操 | 国产三级在线观看视频 | 亚洲欧美强伦一区二区 | 色欧美日韩 | av福利站 | 亚洲一级成人 | 一区二区在线免费视频 | 在线观看精品国产 | 免费黄色观看 | 欧美爱爱爱 | 日韩国产区 | 久久性 | 中文字幕天堂 | 日韩一区二区三区精 | 99久久久国产精品 | japanese21ⅹxx日本 | a级片免费视频 | 99性趣网 | 欧美久久久久久久 | 亚洲中文字幕无码av | 伊人网伊人网 | 九九精品九九 | 99热这里是精品 | 久久久www | 免费观看毛片视频 | 成人久久一区 | 成年人看的网站 | 欧美国产在线视频 | 欧美在线a | 欧美色视频在线 | 久久草av| 蜜色视频 | 中文字幕第22页 | 午夜精产品一区二区在线观看的 | 亚洲综合区| 午夜91视频 | av鲁丝一区二区鲁丝 | 人妖天堂狠狠ts人妖天堂狠狠 | 亚洲国产91 | 亚洲精品国偷拍自产在线观看蜜桃 | 成年人视频网站 | 日韩久久毛片 | 999zyz玖玖资源站永久 | 国产特黄 | 用力挺进新婚白嫩少妇 | 中文黄色片 | 爱福利视频广场 | 逼逼爱插插网站 | 黄色国产一区 | 亚洲午夜影视 | 欧美日色 | 亚洲图片 欧美 | 超碰66 | 国产丝袜一区二区 | 国产精品三区四区 | 中文人妻熟女乱又乱精品 | 五月的婷婷 | 亚洲超碰av | 免费a级黄色片 | 91成人在线视频 | 特大黑人巨交性xxxx | 一级大片在线观看 | 奇米影视第四色888 免费观看a毛片 | 福利片av | 欧美激情性生活 | 欧美日韩中文一区 | 国产va在线观看 | 亚洲激情二区 | 日韩理论在线 | 免费av在线网站 | 在线小视频 | 欧美成人免费在线观看视频 | 怡春院国产 | 黄色三级免费观看 | 亚洲一区二区三区四 | 韩国三色电费2024免费吗怎么看 | 高h校园不许穿内裤h调教 | 蜜桃av鲁一鲁一鲁一鲁俄罗斯的 | 日韩av动漫 | 久久久久久蜜桃 | 性v天堂| 无码无遮挡又大又爽又黄的视频 | 久久久综合久久 | 久久伊人婷婷 | 精品国产成人av在线免 | 香蕉视频在线观看www | 国产麻豆午夜三级精品 | 久草国产在线观看 | av免费在线观 | 亚洲国产精品一区二区尤物区 |