国产精品电影_久久视频免费_欧美日韩国产激情_成年人视频免费在线播放_日本久久亚洲电影_久久都是精品_66av99_九色精品美女在线_蜜臀a∨国产成人精品_冲田杏梨av在线_欧美精品在线一区二区三区_麻豆mv在线看

?Java Record可以完全取代Lombok嗎?

譯文 精選
開發 前端
本文將探討下 JDK14 后新增的 Record 類型,作為數據載體的這一新類型是否可以完全地取代 Lombok。

譯者 | 胥磊

審校 | 梁策 孫淑娟

很長時間以來,Java 都因其冗長而受到一些開發者的詬病。哪怕是最熱衷 Java 的開發者或許也不得不承認,聲明一個只有兩個屬性的 bean 類Java讓人覺得有點可笑。因為如果遵循推薦規范,最終不僅添加了 getter 和 setter方法,還要添加toString, hashcode 和 equals 方法的重寫,最終大塊的樣板文件式的代碼逼得開發者想放棄Java語言。

Java

import java.util.Objects;
public class Car {
private String brand;
private String model;
private int year;
public String getBrand() {
return brand;
}
public void setBrand(String brand) {
this.brand = brand;
}
public String getModel() {
return model;
}
public void setModel(String model) {
this.model = model;
}
public int getYear() {
return year;
}
public void setYear(int year) {
this.year = year;
}
@Override
public String toString() {
return "Car{" +
"brand='" + brand + '\'' +
", model='" + model + '\'' +
", year=" + year +
'}';
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
Car car = (Car) o;
return year == car.year && Objects.equals(brand, car.brand) && Objects.equals(model, car.model);
}
@Override
public int hashCode() {
return Objects.hash(brand, model, year);
}
}

幸運的是,Lombok的橫空出世大大減輕了Java開發者的痛苦。但自從有了與其作用相似的Java Record類型,有人可能會問:Record是否可以全面取代Lombok呢?

1.Lombok是什么?

Lombok是一個與開發環境高度集成的 Java 類庫(當然也可以看成一種語法糖),通過注解改進(spice)代碼,它在 Java 社區中被廣泛接受和使用。

使用了Lombok后,我們新建一個名為Car的類是這樣的:

Java

import lombok.Data;
@Data
public class Car {
private String brand;
private String model;
private int year;
}

代碼更加簡潔,同時也不會影響之前版本的任何功能。

2.Java Record是什么?

定義的每一個Java Record類型可以簡單地看做是值對象(Value Object)模式的實現。它本質還是一個 Java 類,其中所有的屬性都是final的。所以在創建對象時所有類屬性都需要傳遞。Java Record是在 Java 14中引入的,它將持續改進,提升類設計。

通過Record新建Car類是這樣的:

Java

public record Car(String brand, String model, int year) 
{

與前一個版本對比,改進非常明顯。

下文將分析Lombok的一些特性,并通過和Record進行比較來評估是否可以永久讓Lombok退出歷史舞臺。

3.不可變性

Record默認情況下是不可變的,這意味著所有的類屬性都被隱式的聲明為 final。我們通常認為Record和值對象(Value Objects)很相似,但是它們沒有 setter 方法,所有的值都需要在構造函數中傳遞。Lombok可以使用@Value 注解達成同樣的效果,但也可以使用@Data注解來保持可變性。

Java

import lombok.Value;
@Value
public class Car {
private String brand;
private String model;
private int year;
}

4.Bean公約

Record并不打算遵循 bean的公約,獲取對象的方法不使用 getX 的方式命名,同時也不再提供 setter 方法和無參的構造函數。另一方面,Lombok只需使用@Data注解就可以將一個類輕松轉換為 JavaBean。

5.Builder

Builder構建器模式是改善對象、創建語法很棒的一種設計模式。Lombok為我們提供了@Builder這個很實用的注解,它幫我們實現了所有樣板代碼。到目前為止,Java Record 并不打算提供此類實現。

Java

import lombok.Builder;
@Builder
public class Car {
private String brand;
private String model;
private int year;
public static void main(String[] args) {
Car myCamaro = Car.builder()
.brand("Chevrolet")
.model("Camaro")
.year(2022)
.build();
}
}

6.多fields類

Record只對少量fields的類是友好的。但是,如果再向其中添加10個fields,那么得到的會是一個龐大的構造函數(繁多的入參),隨之而來的還有多參構造函數所帶來的固有的問題(傳參易錯位,方法重載難判斷等)。

Java

public record DetailedCar(
String brand, String model, int year,
String engineCode, String engineType, String requiredFuel,
String fuelSystem, String maxHorsePower, String maxTorque,
float fuelCapacity) {
}

Java

DetailedCar camaroDetailed = new DetailedCar(
"Chevrolet", "Camaro", 2022, "LTG", "Turbocharged",
"Gas I4", "Direct Injection", "275 @ 560", "295 @ 3000-4500",
19.0f);

使用了Lombok,我們就可以決定創建bean類是選擇使用 setter來設置對象的狀態,還是使用builder這種更簡潔的方式來構造實例。唯一需要注意的是,因為其默認不會強制設置所有屬性,所以可能使實例處于屬性不完整狀態。當然@Builder 注解支持我們將類中所有屬性標記為@nonNull,這樣在構建時屬性就是必需的。如果必需屬性缺失設置則會在運行時拋出一個異常,而不是編譯時強制拋出異常。

Java

import lombok.Builder;
import lombok.NonNull;
@Builder
public class DetailedCar {
@NonNull
private String brand;
@NonNull
private String model;
@NonNull
private int year;
@NonNull
private String engineCode;
@NonNull
private String engineType;
@NonNull
private String requiredFuel;
@NonNull
private String fuelSystem;
@NonNull
private String maxHorsePower;
@NonNull
private String maxTorque;
@NonNull
private float fuelCapacity;
public static void main(String[] args) {
DetailedCar camaroIncomplete = DetailedCar.builder()
.brand("Chevrolet")
.model("Camaro")
.year(2022)
.build();
}
}

輸出:

Exception in thread "main" java.lang.NullPointerException: engineCode is marked non-null but is null

7.繼承

到目前為止,Java Record類是不支持繼承的,所以不能通過擴展其他Record類來創建一個新的Record類,這可能是模型設計的一個限制。盡管如此,我們也要認識到組合優于繼承(面向對象設計原則之七)。

Java

@Data
@ToString(callSuper = true)
@EqualsAndHashCode(callSuper = true)
public class Car extends MotorVehicle {
private String brand;
private String model;
private int year;
}

8.結論

Record是Java的一個極佳的新特性,它正推動代碼向更簡潔的方向發展,因此應該多多使用。對于提供了眾多功能的Lombok,考慮到Java變更的緩慢速度,要在項目中將其徹底取代似乎還為時尚早。

原文鏈接:https://dzone.com/articles/records-vs-lombok

譯者介紹

胥磊,51CTO社區編輯,某頭部電商技術副總監,關注Java后端開發,技術管理,架構優化,分布式開發等領域。

責任編輯:武曉燕 來源: 51CTO技術棧
相關推薦

2022-07-20 08:16:54

Lombokjava工具

2024-01-11 13:21:53

開發代碼

2023-09-21 15:05:12

ChatGPT搜索引擎

2020-08-04 10:03:03

Python開發語言

2018-10-19 11:19:32

云存儲現場存儲云服務

2010-03-22 09:49:01

智能交換機

2019-01-04 09:30:05

人工智能同傳翻譯深度學習

2019-08-01 14:00:21

2022-04-02 11:28:37

元宇宙遠程辦公

2025-01-20 00:00:00

Java語言Record

2020-11-07 16:25:50

人工智能技術IT

2024-06-07 08:33:54

2009-01-16 15:33:10

EMCCLARiiON存儲市場

2022-11-29 07:33:15

JavaLombokRecord

2017-10-10 09:58:44

人工智能 應用 臨床

2015-10-15 12:00:44

2023-03-28 07:55:22

固態硬盤機械硬盤芯片

2019-02-26 13:53:07

PythonJava編程語言

2018-05-04 09:25:47

2018-03-19 16:05:51

前端程序員
點贊
收藏

51CTO技術棧公眾號

激情小说亚洲一区| 少妇久久久久| 国产伦一区二区三区| 亚洲日韩中文字幕| 九七久久人人| 精品国产91乱高清在线观看| 色哟哟精品视频| 国产.欧美.日韩| 中文字幕免费在线不卡| 亚洲欧美日本国产专区一区| 国产主播欧美精品| 成人羞羞网站| 国产97在线观看| 九九精品在线| 91久久久久久久一区二区| 国产亚洲欧美日韩在线观看一区二区| 欧美成人性生活| 999色成人| 91高清免费在线观看| 素人啪啪色综合| 欧美日韩欧美一区二区| 可以在线观看的黄色| 欧美午夜精品久久久| 国产综合在线观看| 日韩欧美国产高清| 青春草免费在线视频| 日韩精品在线观看一区二区| 国产精品专区免费| 亚洲18私人小影院| 国产精品免费大片| 国产精品久久久久久久天堂第1集| 99久久婷婷国产综合精品电影√| 国产日韩亚洲欧美| 久久99国产精品麻豆| 久久精品.com| 色哟哟日韩精品| 久久久男人天堂| 久久久久久中文| 亚洲视频中文| 男女激情视频一区| 国产精品美女午夜爽爽| 亚洲精品久久久久| 国产三级在线看| 中文字幕日韩精品在线观看| 123成人网| 狠狠色噜噜狠狠色综合久| 国产亚洲一二三区| 激情av在线播放| 91高跟黑色丝袜呻吟在线观看| jlzzjlzz亚洲日本少妇| 精品国产一区二区三区不卡 | 国产精品嫩草视频| 中文字幕日韩一区二区| 亚洲一区二区三区免费| 女人床在线观看| 日韩一级成人av| 香蕉国产精品| 在线免费观看你懂的| 欧美成人久久久| 国产麻豆精品视频| 国产成人精品亚洲日本在线观看| 免费久久久一本精品久久区| 欧美精品免费视频| 韩国一区二区三区| 日韩福利在线观看| 亚洲第一中文av| 国内精品视频久久| 久久综合九色综合欧美亚洲| 女生影院久久| 国产精品免费入口| 国产成人欧美在线观看| 超碰个人在线| 黄色在线网站噜噜噜| 亚洲jizzjizz日本少妇| 国产一区二区在线看| 意大利激情丛林无删减版dvd| 精品久久人人做人人爱| 伊人久久大香线蕉综合四虎小说 | 日韩网站中文字幕| 亚洲精品中文字幕有码专区| 日皮视频在线观看| 美国av一区二区三区| 7878视频在线观看| 欧美成人午夜影院| 首页亚洲中字| 国产精选一区二区| av网站免费线看精品| 日日噜噜噜夜夜爽爽狠狠| 欧美一区二区国产| www.丝袜精品| 国模精品一区二区三区| 丝袜美腿精品国产二区| 性人久久久久| 欧美一区二区三区在线播放 | 中文在线手机av| xxxx性欧美| 久久人人超碰| 欧美精品久久久久久久自慰| 91在线观看视频| 日本一区二区三区四区五区六区| 久久精品欧美日韩精品| 亚洲人成网站在线在线观看| 91在线看黄| 老司机精品影院| 国内精品久久久久影院 日本资源| 亚洲综合不卡| 快播av资源| 最近2019中文字幕大全第二页| 亚洲无线视频| 69久久夜色精品国产69蝌蚪网| 91蜜桃臀久久一区二区| 久久国产精品视频在线观看| 91精品国产一区二区人妖| 国产精品115| 97视频久久久| 国产婷婷成人久久av免费高清| 久久中文在线| 电影亚洲一区| 成年人视频观看| 欧美成人免费大片| 欧美激情免费| 国产精品久久综合av爱欲tv| 久久久噜噜噜久久中文字幕色伊伊| 在线女人免费视频| 缅甸午夜性猛交xxxx| 欧美国产日韩一区| 天天av天天翘天天综合网 | 国产一区二区在线观| 日本三级中文字幕在线观看| jlzzjlzz亚洲日本少妇| 亚洲色图久久久| 中文字幕欧美精品在线| 国产欧美一区二区精品性| 亚久久调教视频| 26uuu国产电影一区二区| 欧美人与性动交a欧美精品| 国产传媒一区在线| 午夜av不卡| 中文字幕在线中文字幕日亚韩一区| 91精品国产综合久久久久久久 | 欧美国产精品人人做人人爱| 久久一区二区三区超碰国产精品| 新版的欧美在线视频| 米仓穗香在线观看| 欧美夜福利tv在线| 欧美精品一区二区三| 中国色在线观看另类| 亚洲美女毛片| yellow视频在线观看一区二区| 亚洲情趣在线观看| 免费人成精品欧美精品| 亚洲综合图色| 欧美一区=区三区| 成人日韩欧美| 黄色免费看片| 国产精品久久久毛片| 国产精品自拍合集| 欧美亚洲伦理www| 亚洲h在线观看| 国产麻豆一区二区三区精品视频| 色婷五月综激情亚洲综合| 91免费看网站| 国产精品视频yy9099| 亚洲天堂av线| 亚洲成人自拍| 日韩国产激情在线| 国产欧美一区二区三区网站| av在线亚洲一区| 国产私人影院| 欧美日韩免费观看一区| 在线精品高清中文字幕| 亚洲色图都市小说| 波多野结衣天堂| 在线观看国产一区| 日本最新一区二区三区视频观看| 国产精品亚洲自拍| 国产精品香蕉av| 国产精品色婷婷视频| 欧美国产第一页| 国内精品久久久久久| 免费成人av| 欧美久久综合网| 欧美丰满日韩| 欧美成年网站| 久久视频在线| 欧美激情无毛| 久久久久99| 99视频精品在线| 最新日韩av在线| 一本大道久久精品懂色aⅴ| 欧美在线视频你懂得| 欧美一卡二卡在线| 亚洲欧美成人网| 欧美高跟鞋交xxxxxhd| 久久视频在线免费观看| 成人免费视频网站入口| 欧美激情乱人伦一区| 最新亚洲国产精品| 中文字幕二三区不卡| 26uuu久久综合|