欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Java中你絕對沒用過的一個關(guān)鍵字Record的使用

 更新時間:2022年11月29日 22:35:49   作者:鴨血粉絲Tang  
這篇文章主要給大家介紹一個?Java?中的一個關(guān)鍵字?Record,那?Record?關(guān)鍵字跟不可變類有什么關(guān)系呢?看完今天的文章你就知道了,快跟隨小編一起學(xué)習(xí)一下吧

前面的文章給大家介紹了如何自定義一個不可變類,沒看過的小伙伴建議去看一下,這節(jié)課給大家介紹一個 Java 中的一個關(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 之后的話,那么你就會看到下面這個提示,提示我們可以將 Teacher 這個不可變類轉(zhuǎn)換為 Record。怎么樣是不是很懵,沒關(guān)系,我們按照提示操作一下看看會發(fā)生什么。

點完之后我們的代碼會變成下面的樣子

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ù)?乍一看還以為變成一個方法了。此外我們之前的測試代碼不用修改任何邏輯,照樣可以正常運行,是不是很神奇?這就是 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 定義的類可以提供緊湊的方式進行參數(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

下面我們看下第四點和第五點,關(guā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<>());
??}

在使用的時候,我們就可以直接通過類名引用靜態(tài)方法就可以了,如下所示

?Teacher?teacher?=?Teacher.of();

接下來我們看看什么叫緊湊的方式進行參數(shù)校驗,試想一下,如果我們需要校驗在溝通 Teacher 對象的時候,student 成員變量不能為空,在我們以前的寫法里面只要在構(gòu)造方法里面進行一下判空就可以了,但是對于 Record 的形式,我們沒有顯示的創(chuàng)建構(gòu)造方法,那我們應(yīng)該如何進行判斷呢?答案如下

??public?Teacher?{
????if?(null?==?students?||?students.size()?==?0)?{
??????throw?new?IllegalArgumentException();
????}
??}

可以看到我們通過一種緊湊的構(gòu)造方法的形式來進行了參數(shù)的校驗,這種寫法跟我們普通的構(gòu)造方法是不一樣的,沒有方法參數(shù),怎么樣是不是很神奇。

總結(jié)

有的人說 Java 的 Record 的新特性是為了讓大家不使用 Lombok 的,阿粉倒是覺得不見得,畢竟 Lombok 用起來是真的香,而且 Record  也只能是定義不可變類,在某些情況下使用還是有局限性的,不可變類的使用場景并不是很多。

到此這篇關(guān)于Java中你絕對沒用過的一個關(guān)鍵字Record的使用的文章就介紹到這了,更多相關(guān)Java關(guān)鍵字Record內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

相關(guān)文章

  • Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用

    Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用

    今天小編就為大家分享一篇關(guān)于Junit 5中@ParameterizedTest與@EnumSource結(jié)合使用,小編覺得內(nèi)容挺不錯的,現(xiàn)在分享給大家,具有很好的參考價值,需要的朋友一起跟隨小編來看看吧
    2018-12-12
  • java?Semaphore共享鎖實現(xiàn)原理解析

    java?Semaphore共享鎖實現(xiàn)原理解析

    這篇文章主要為大家介紹了Semaphore共享鎖實現(xiàn)原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-01-01
  • java.util.Date與java.sql.Date的區(qū)別

    java.util.Date與java.sql.Date的區(qū)別

    這篇文章主要介紹了java.util.Date與java.sql.Date的區(qū)別的相關(guān)資料,需要的朋友可以參考下
    2015-07-07
  • Java 多線程的同步代碼塊詳解

    Java 多線程的同步代碼塊詳解

    這篇文章主要介紹了Java 多線程的同步代碼塊,使用synchronized關(guān)鍵字創(chuàng)建線程同步方法是實現(xiàn)線程同步的關(guān)鍵,需要的朋友可以參考下
    2021-10-10
  • HttpUtils 發(fā)送http請求工具類(實例講解)

    HttpUtils 發(fā)送http請求工具類(實例講解)

    下面小編就為大家?guī)硪黄狧ttpUtils 發(fā)送http請求工具類(實例講解)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-07-07
  • java開發(fā)主流定時任務(wù)解決方案全橫評詳解

    java開發(fā)主流定時任務(wù)解決方案全橫評詳解

    這篇文章主要為大家介紹了java開發(fā)主流定時任務(wù)解決方案全橫評詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2022-09-09
  • Java實現(xiàn)一個簡單的緩存方法

    Java實現(xiàn)一個簡單的緩存方法

    本篇文章主要介紹了Java實現(xiàn)一個簡單的緩存方法,小編覺得挺不錯的,現(xiàn)在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-04-04
  • java中的動態(tài)代理與責(zé)任鏈模式詳解

    java中的動態(tài)代理與責(zé)任鏈模式詳解

    這篇文章主要介紹了java中的動態(tài)代理與責(zé)任鏈模式詳解,動態(tài)代理提供了一種靈活且非侵入式的方式,可以對對象的行為進行定制和擴展,它在代碼重用、解耦和業(yè)務(wù)邏輯分離、性能優(yōu)化以及系統(tǒng)架構(gòu)中起到了重要的作用,需要的朋友可以參考下
    2023-08-08
  • SpringMVC實現(xiàn)文件上傳和下載的工具類

    SpringMVC實現(xiàn)文件上傳和下載的工具類

    這篇文章主要為大家詳細(xì)介紹了SpringMVC實現(xiàn)文件上傳和下載的工具類,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2020-05-05
  • SpringBoot全局Controller返回值格式統(tǒng)一

    SpringBoot全局Controller返回值格式統(tǒng)一

    本文主要介紹了SpringBoot全局Controller返回值格式統(tǒng)一,文中通過示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下
    2021-07-07

最新評論