Java中你絕對沒用過的一個(gè)關(guān)鍵字Record的使用
前面的文章給大家介紹了如何自定義一個(gè)不可變類,沒看過的小伙伴建議去看一下,這節(jié)課給大家介紹一個(gè) Java
中的一個(gè)關(guān)鍵字 Record
,那 Record
關(guān)鍵字跟不可變類有什么關(guān)系呢?看完今天的文章你就知道了。
友情提示 Record
關(guān)鍵字在 Java14
過后才支持的,所以是不是被阿粉說中了,還在使用 Java 8
的你一定沒用過!
不可變類
我們先看一下之前定義的不可變類,代碼如下。
package?com.example.demo.immutable; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.List; import?java.util.Map; public?final?class?Teacher?{ ??private?final?String?name; ??private?final?List<String>?students; ??private?final?Address?address; ??private?final?Map<String,?String>?metadata; ??public?Teacher(String?name,?List<String>?students,?Address?address,?Map<String,?String>?metadata)?{ ????this.name?=?name; ????this.students?=?students; ????this.address?=?address; ????this.metadata?=?metadata; ??} ??public?String?getName()?{ ????return?name; ??} ??public?List<String>?getStudents()?{ ????return?new?ArrayList<>(students); //????return?students; ??} ??public?Address?getAddress()?{ //????return?address; ????return?address.clone(); ??} ??public?Map<String,?String>?getMetadata()?{ ????return?new?HashMap<>(metadata); //????return?metadata; ??} }
如果你復(fù)制上面代碼到 IDEA
中,并且剛好你的 JDK
版本是 Java14
之后的話,那么你就會看到下面這個(gè)提示,提示我們可以將 Teacher
這個(gè)不可變類轉(zhuǎn)換為 Record
。怎么樣是不是很懵,沒關(guān)系,我們按照提示操作一下看看會發(fā)生什么。
點(diǎn)完之后我們的代碼會變成下面的樣子
package?com.example.demo.immutable; import?java.util.ArrayList; import?java.util.HashMap; import?java.util.List; import?java.util.Map; public?record?Teacher(String?name,?List<String>?students,?Address?address,?Map<String,?String>?metadata)?{ ??@Override ??public?List<String>?students()?{ ????return?new?ArrayList<>(students); //????return?students; ??} ??@Override ??public?Address?address()?{ //????return?address; ????return?address.clone(); ??} ??@Override ??public?Map<String,?String>?metadata()?{ ????return?new?HashMap<>(metadata); //????return?metadata; ??} }
仔細(xì)一看你會發(fā)現(xiàn),這是什么情況,record
是什么關(guān)鍵字,然后類名后面怎么還有參數(shù)?乍一看還以為變成一個(gè)方法了。此外我們之前的測試代碼不用修改任何邏輯,照樣可以正常運(yùn)行,是不是很神奇?這就是 Record
關(guān)鍵字的特性。
Record 關(guān)鍵字
看完了 Record
關(guān)鍵字的 case
,我們來聊一下 Record
關(guān)鍵字是怎么用的,以及它有什么特性。
Record
關(guān)鍵定義的類是不可變類;Record
定義的類需要將所有成員變量通過參數(shù)的形式定義;Record
定義的類默認(rèn)會生成全部參數(shù)的構(gòu)造方法;Record
定義的類中可以定義靜態(tài)方法;Record
定義的類可以提供緊湊的方式進(jìn)行參數(shù)校驗(yàn);
上面的五點(diǎn)里面前三點(diǎn)我們在之前的例子中都可以看出來,在定義和使用的時(shí)候可以明顯的看到,如下所示。
public?record?Teacher(String?name,?List<String>?students,?Address?address,?Map<String,?String>?metadata)?{ }//1,2 ?Teacher?teacher?=?new?Teacher("Java極客技術(shù)",?students,?address,?metadata);//3
下面我們看下第四點(diǎn)和第五點(diǎn),關(guān)于第四點(diǎn)我們可以在 Record
類中定義靜態(tài)方法用來默認(rèn)初始化對象,如下所示,通過這種方式我們可以寫出更簡潔的代碼。
??public?static?Teacher?of()?{ ????return?new?Teacher("Java極客技術(shù)",?new?ArrayList<>(),?new?Address(),?new?HashMap<>()); ??} ??public?static?Teacher?of(String?name)?{ ????return?new?Teacher(name,?new?ArrayList<>(),?new?Address(),?new?HashMap<>()); ??}
在使用的時(shí)候,我們就可以直接通過類名引用靜態(tài)方法就可以了,如下所示
?Teacher?teacher?=?Teacher.of();
接下來我們看看什么叫緊湊的方式進(jìn)行參數(shù)校驗(yàn),試想一下,如果我們需要校驗(yàn)在溝通 Teacher
對象的時(shí)候,student
成員變量不能為空,在我們以前的寫法里面只要在構(gòu)造方法里面進(jìn)行一下判空就可以了,但是對于 Record
的形式,我們沒有顯示的創(chuàng)建構(gòu)造方法,那我們應(yīng)該如何進(jìn)行判斷呢?答案如下
??public?Teacher?{ ????if?(null?==?students?||?students.size()?==?0)?{ ??????throw?new?IllegalArgumentException(); ????} ??}
可以看到我們通過一種緊湊的構(gòu)造方法的形式來進(jìn)行了參數(shù)的校驗(yàn),這種寫法跟我們普通的構(gòu)造方法是不一樣的,沒有方法參數(shù),怎么樣是不是很神奇。
總結(jié)
有的人說 Java
的 Record
的新特性是為了讓大家不使用 Lombok
的,阿粉倒是覺得不見得,畢竟 Lombok
用起來是真的香,而且 Record
也只能是定義不可變類,在某些情況下使用還是有局限性的,不可變類的使用場景并不是很多。
到此這篇關(guān)于Java中你絕對沒用過的一個(gè)關(guān)鍵字Record的使用的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字Record內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
2023最新版本idea用maven新建web項(xiàng)目(親測不報(bào)錯(cuò))
這篇文章主要給大家介紹了關(guān)于2023最新版本idea用maven新建web項(xiàng)目,Maven是當(dāng)今Java開發(fā)中主流的依賴管理工具,文中介紹的步驟親測不報(bào)錯(cuò),需要的朋友可以參考下2023-07-07IntelliJ IDEA下自動(dòng)生成Hibernate映射文件以及實(shí)體類
這篇文章主要介紹了IntelliJ IDEA下自動(dòng)生成Hibernate映射文件以及實(shí)體類,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2019-11-11Java16 JDK安裝并設(shè)置環(huán)境變量的方法步驟
突然想起自己大學(xué)剛接觸java的時(shí)候,要下載JDK和配置環(huán)境變量,那時(shí)候我上網(wǎng)找了很多教學(xué),本文就詳細(xì)的介紹一下Java16 JDK安裝并設(shè)置環(huán)境變量,感興趣的可以了解一下2021-09-09mybatis中注解與xml配置的對應(yīng)關(guān)系和對比分析
這篇文章主要介紹了mybatis中注解與xml配置的對應(yīng)關(guān)系和對比分析,具有很好的參考價(jià)值,希望對大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2021-08-08解析SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程
這篇文章主要介紹了SpringBoot項(xiàng)目開發(fā)之Gzip壓縮過程,本文給大家分享幾種Gzip壓縮方式,通過實(shí)例代碼給大家介紹的非常詳細(xì),對大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2020-07-07Java流程控制之循環(huán)結(jié)構(gòu)while、do...while
這篇文章主要介紹了Java流程控制之循環(huán)結(jié)構(gòu)while及do...while,文章除了講解循環(huán)結(jié)構(gòu)while和do...while之外,還講解了他們之間的區(qū)別,下面我們就一起進(jìn)入文章講解更多詳細(xì)內(nèi)容吧2021-12-12