JDK14的新特性:Lombok的终结者record
文章目錄
- 簡(jiǎn)介
- 新的Record類型
- 探討Record的秘密
- record擴(kuò)展
- 總結(jié)
JDK 14的新特性:Lombok的終結(jié)者record
簡(jiǎn)介
自從面向?qū)ο螽a(chǎn)生之后,程序界就開始了新的變化,先是C發(fā)展到了C++,后面java橫空出世,大有一統(tǒng)江湖的趨勢(shì)。
面向?qū)ο髴{借其結(jié)構(gòu)化的特點(diǎn)和在大型項(xiàng)目中的優(yōu)勢(shì),一路蓬勃發(fā)展到今。面向?qū)ο蟛皇遣缓?#xff0c;但是太繁瑣。
比如我們要定義一個(gè)簡(jiǎn)單的存儲(chǔ)數(shù)據(jù)的結(jié)構(gòu),比如說(shuō)User。除了要定義其內(nèi)部的具體字段以外,我們還要定義get set方法,定義構(gòu)造函數(shù),equals(), hashCode(), toString()等。
為了解決這個(gè)問(wèn)題,也產(chǎn)生了很多解決方案,比如Lombok,可以通過(guò)注解就自動(dòng)生成特定的存取方法和構(gòu)造函數(shù)。但是Lombok生成的代碼看不到,在代碼調(diào)試方面有一定的劣勢(shì)。
終于JDK 14為我們帶來(lái)了record,雖然還是預(yù)覽特性,但是今天我們一覽為快。
新的Record類型
Record是一種輕量級(jí)的class,可以看做是數(shù)據(jù)結(jié)構(gòu)體。和scala中的case有點(diǎn)相似。
舉個(gè)自定義User的例子看一下Record是怎么用的:
public record Address(String addressName,String city ) { } public record CustUser(String firstName,String lastName,Address address,int age ) {}上面我們定義了兩個(gè)類,CustUser和Address。CustUser中引用了Address。
Record和普通的類的區(qū)別就在于Record多了一個(gè)括號(hào)括起來(lái)的定義的字段。
Record類默認(rèn)是final的,里面的字段默認(rèn)是private final的。
探討Record的秘密
要想知道Record到底是怎么工作的,我們可以使用javap來(lái)對(duì)編譯好的class文件反編譯,運(yùn)行javap CustUser,可以得到下面的結(jié)果:
警告: 二進(jìn)制文件CustUser包含com.flydean.records.CustUser Compiled from "CustUser.java" public final class com.flydean.records.CustUser extends java.lang.Record {public com.flydean.records.CustUser(java.lang.String, java.lang.String, com.flydean.records.Address, int);public java.lang.String toString();public final int hashCode();public final boolean equals(java.lang.Object);public java.lang.String firstName();public java.lang.String lastName();public com.flydean.records.Address address();public int age(); }上面可以看到final class CustUser繼承自java.lang.Record。
并且自動(dòng)添加了默認(rèn)帶有所有字段的構(gòu)造函數(shù)。各個(gè)自動(dòng)的獲取方法,并實(shí)現(xiàn)了toString,hashCode和equals方法。
天啦,太完美了,我們想要的它居然都有。
如果上面的javap還不是很清楚的話,大家可以借助IDE的反編譯功能,打開CustUser.class文件看一看:
public final class CustUser extends java.lang.Record {private final java.lang.String firstName;private final java.lang.String lastName;private final com.flydean.records.Address address;private final int age;public CustUser(java.lang.String firstName, java.lang.String lastName, com.flydean.records.Address address, int age) { /* compiled code */ }public java.lang.String toString() { /* compiled code */ }public final int hashCode() { /* compiled code */ }public final boolean equals(java.lang.Object o) { /* compiled code */ }public java.lang.String firstName() { /* compiled code */ }public java.lang.String lastName() { /* compiled code */ }public com.flydean.records.Address address() { /* compiled code */ }public int age() { /* compiled code */ } }注意,上面的反編譯我們可以看到,record中的所有字段都是final的,只能在初始化的時(shí)候設(shè)置。并且方法里面也沒有提供其他可以改變字段內(nèi)容的方法。
所以我們得出了一個(gè)震世驚俗的結(jié)論:record是immutable的。
record擴(kuò)展
上面的例子中我們只使用了小括號(hào)里面的內(nèi)容,大括號(hào)還是空的呀。可不可以像其他正常的類一樣,添加點(diǎn)方法或者構(gòu)造函數(shù)進(jìn)去呢?
答案是肯定的。
先看一個(gè)整體的方案:
public record CustUserWithBody(String firstName,String lastName,Address address,int age ) {public String fullName(){return firstName+ lastName;}public CustUserWithBody{if (age < 18) {throw new IllegalArgumentException( "男大當(dāng)婚,女大當(dāng)嫁,18歲未到,不許出嫁!");}} }我們?cè)趓ecord的主題中,定義了一個(gè)方法和一個(gè)構(gòu)造函數(shù)。
先看這個(gè)方法,在方法中我們可以訪問(wèn)到record中定義的變量,但是千萬(wàn)不要嘗試去修改他們,因?yàn)樗麄兪莊inal的,你會(huì)得到一個(gè)變異錯(cuò)誤。
再看這個(gè)構(gòu)造函數(shù),這個(gè)構(gòu)造函數(shù)沒有小括號(hào),只有大括號(hào),這種構(gòu)造函數(shù)叫做Compact constructor。你無(wú)法在record中定義正常的構(gòu)造函數(shù),因?yàn)闀?huì)得到一個(gè)編譯錯(cuò)誤。
在這個(gè)Compact constructor中,我們可以對(duì)定義的字段進(jìn)行數(shù)據(jù)校驗(yàn)。如上所述。
總結(jié)
record是個(gè)好東西,希望能夠出現(xiàn)在JDK的正式版本中。
最后,很多人可能有個(gè)疑問(wèn),JDK14聲勢(shì)這么浩大,怎么感覺大的顛覆性的更新也沒有太多。
那么我以一個(gè)過(guò)來(lái)人的身份來(lái)回答一下這個(gè)問(wèn)題:第一,JDK肯定要保持穩(wěn)定,新特性都是次要的,穩(wěn)定壓倒一切。所以6個(gè)月說(shuō)長(zhǎng)不長(zhǎng)說(shuō)短不短的時(shí)間里面注定不會(huì)有大的更新。第二,歐美公司的通病,在歐美公司工作不要太瀟灑,不但可以不打卡,在家上班,上班也是大大小小的會(huì)議開個(gè)不停,最后留下來(lái)寫程序的時(shí)間自然不會(huì)很多。牛人大神有很多,渾水摸魚的也不少。效率的話自然比不了國(guó)內(nèi)的996+857了。
本文的例子https://github.com/ddean2009/learn-java-base-9-to-20
更多精彩內(nèi)容且看:
- 區(qū)塊鏈從入門到放棄系列教程-涵蓋密碼學(xué),超級(jí)賬本,以太坊,Libra,比特幣等持續(xù)更新
- Spring Boot 2.X系列教程:七天從無(wú)到有掌握Spring Boot-持續(xù)更新
- Spring 5.X系列教程:滿足你對(duì)Spring5的一切想象-持續(xù)更新
- java程序員從小工到專家成神之路(2020版)-持續(xù)更新中,附詳細(xì)文章教程
歡迎關(guān)注我的公眾號(hào):程序那些事,更多精彩等著您!
更多內(nèi)容請(qǐng)?jiān)L問(wèn) www.flydean.com
總結(jié)
以上是生活随笔為你收集整理的JDK14的新特性:Lombok的终结者record的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 自定义parallelStream的th
- 下一篇: fail-safe fail-fast知