偷偷摘套内射激情视频,久久精品99国产国产精,中文字幕无线乱码人妻,中文在线中文a,性爽19p

Java 中你絕對(duì)沒(méi)用過(guò)的一個(gè)關(guān)鍵字?

開(kāi)發(fā) 前端
有的人說(shuō) Java 的 Record 的新特性是為了讓大家不使用 Lombok 的,阿粉倒是覺(jué)得不見(jiàn)得,畢竟 Lombok 用起來(lái)是真的香,而且 Record 也只能是定義不可變類(lèi),在某些情況下使用還是有局限性的,不可變類(lèi)的使用場(chǎng)景并不是很多。

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

不可變類(lèi)

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

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? 之后的話,那么你就會(huì)看到下面這個(gè)提示,提示我們可以將 Teacher? 這個(gè)不可變類(lèi)轉(zhuǎn)換為 Record。怎么樣是不是很懵,沒(méi)關(guān)系,我們按照提示操作一下看看會(huì)發(fā)生什么。

圖片

點(diǎn)完之后我們的代碼會(huì)變成下面的樣子。

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

圖片

Record 關(guān)鍵字

看完了 Record? 關(guān)鍵字的 case? ,我們來(lái)聊一下 Record 關(guān)鍵字是怎么用的,以及它有什么特性。

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

上面的五點(diǎn)里面前三點(diǎn)我們?cè)谥暗睦又卸伎梢钥闯鰜?lái),在定義和使用的時(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 類(lèi)中定義靜態(tài)方法用來(lái)默認(rèn)初始化對(duì)象,如下所示,通過(guò)這種方式我們可以寫(xiě)出更簡(jiǎ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í)候,我們就可以直接通過(guò)類(lèi)名引用靜態(tài)方法就可以了,如下所示

 Teacher teacher = Teacher.of();

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

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

圖片

可以看到我們通過(guò)一種緊湊的構(gòu)造方法的形式來(lái)進(jìn)行了參數(shù)的校驗(yàn),這種寫(xiě)法跟我們普通的構(gòu)造方法是不一樣的,沒(méi)有方法參數(shù),怎么樣是不是很神奇。

總結(jié)

有的人說(shuō) Java 的 Record 的新特性是為了讓大家不使用 Lombok 的,阿粉倒是覺(jué)得不見(jiàn)得,畢竟 Lombok 用起來(lái)是真的香,而且 Record  也只能是定義不可變類(lèi),在某些情況下使用還是有局限性的,不可變類(lèi)的使用場(chǎng)景并不是很多。

責(zé)任編輯:武曉燕 來(lái)源: Java極客技術(shù)
相關(guān)推薦

2017-07-26 10:08:06

FABDesign SuppAndroid

2022-07-20 07:29:52

Java類(lèi)

2021-01-03 16:12:35

Java工具開(kāi)發(fā)

2020-11-04 10:31:29

Jupyter NotPython數(shù)據(jù)分析

2024-09-05 09:30:51

FunctionJava8接口

2024-08-19 02:00:00

FunctionJava8接口

2025-04-28 03:22:00

2019-06-26 10:10:44

Linux終端命令

2020-10-20 18:51:43

C++IDECode

2022-04-19 08:50:43

Java8接口

2024-03-15 08:18:25

volatileAtomic關(guān)鍵字

2024-04-19 09:02:32

前端調(diào)試技巧

2020-01-17 20:00:25

SQL函數(shù)數(shù)據(jù)庫(kù)

2017-03-22 19:52:16

Devops開(kāi)源

2021-06-24 09:08:34

Java代碼泛型

2024-03-26 00:48:38

2023-12-11 13:59:00

YieldPython生成器函數(shù)

2020-08-10 08:00:13

JavaFinal關(guān)鍵字

2012-06-02 00:53:39

Javafinally

2018-09-27 15:58:06

MySQL數(shù)據(jù)庫(kù)性能優(yōu)化
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)