日韩无码专区无码一级三级片|91人人爱网站中日韩无码电影|厨房大战丰满熟妇|AV高清无码在线免费观看|另类AV日韩少妇熟女|中文日本大黄一级黄色片|色情在线视频免费|亚洲成人特黄a片|黄片wwwav色图欧美|欧亚乱色一区二区三区

RELATEED CONSULTING
相關咨詢
選擇下列產(chǎn)品馬上在線溝通
服務時間:8:30-17:00
你可能遇到了下面的問題
關閉右側工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
Java中你絕對沒用過的一個關鍵字?

前面的文章給大家介紹了如何自定義一個不可變類,沒看過的小伙伴建議去看一下,這節(jié)課給大家介紹一個 Java? 中的一個關鍵字 Record?,那 Record? 關鍵字跟不可變類有什么關系呢?看完今天的文章你就知道了。友情提示 Record? 關鍵字在 Java14? 過后才支持的,所以是不是被阿粉說中了,還在使用 Java 8 的你一定沒用過!

網(wǎng)站建設哪家好,找成都創(chuàng)新互聯(lián)公司!專注于網(wǎng)頁設計、網(wǎng)站建設、微信開發(fā)、重慶小程序開發(fā)、集團企業(yè)網(wǎng)站建設等服務項目。為回饋新老客戶創(chuàng)新互聯(lián)還提供了黎城免費建站歡迎大家使用!

不可變類

我們先看一下之前定義的不可變類,代碼如下。

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 students;
private final Address address;
private final Map metadata;

public Teacher(String name, List students, Address address, Map metadata){
this.name = name;
this.students = students;
this.address = address;
this.metadata = metadata;
}

public String getName(){
return name;
}

public List getStudents(){
return new ArrayList<>(students);
// return students;
}

public Address getAddress(){
// return address;
return address.clone();
}

public Map getMetadata(){
return new HashMap<>(metadata);
// return metadata;
}
}

如果你復制上面代碼到 IDEA? 中,并且剛好你的 JDK? 版本是 Java14? 之后的話,那么你就會看到下面這個提示,提示我們可以將 Teacher? 這個不可變類轉換為 Record。怎么樣是不是很懵,沒關系,我們按照提示操作一下看看會發(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 students, Address address, Map metadata){

@Override
public List students(){
return new ArrayList<>(students);
// return students;
}

@Override
public Address address(){
// return address;
return address.clone();
}

@Override
public Map metadata(){
return new HashMap<>(metadata);
// return metadata;
}
}

仔細一看你會發(fā)現(xiàn),這是什么情況,record? 是什么關鍵字,然后類名后面怎么還有參數(shù)?乍一看還以為變成一個方法了。此外我們之前的測試代碼不用修改任何邏輯,照樣可以正常運行,是不是很神奇?這就是 Record 關鍵字的特性。

Record 關鍵字

看完了 Record? 關鍵字的 case? ,我們來聊一下 Record 關鍵字是怎么用的,以及它有什么特性。

  • Record 關鍵定義的類是不可變類;
  • Record 定義的類需要將所有成員變量通過參數(shù)的形式定義;
  • Record 定義的類默認會生成全部參數(shù)的構造方法;
  • Record 定義的類中可以定義靜態(tài)方法;
  • Record 定義的類可以提供緊湊的方式進行參數(shù)校驗;

上面的五點里面前三點我們在之前的例子中都可以看出來,在定義和使用的時候可以明顯的看到,如下所示。

public record Teacher(String name, List students, Address address, Map metadata){
}//1,2
Teacher teacher = new Teacher("Java極客技術", students, address, metadata);//3

下面我們看下第四點和第五點,關于第四點我們可以在 Record 類中定義靜態(tài)方法用來默認初始化對象,如下所示,通過這種方式我們可以寫出更簡潔的代碼。

public static Teacher of(){
return new Teacher("Java極客技術", 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? 成員變量不能為空,在我們以前的寫法里面只要在構造方法里面進行一下判空就可以了,但是對于 Record 的形式,我們沒有顯示的創(chuàng)建構造方法,那我們應該如何進行判斷呢?答案如下

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

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

總結

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


文章名稱:Java中你絕對沒用過的一個關鍵字?
地址分享:http://m.5511xx.com/article/dhpjghe.html