Java 中你絕對沒用過的一個關鍵字?

来源:https://www.cnblogs.com/zi-you/archive/2022/11/29/16936858.html
-Advertisement-
Play Games

layout: post categories: Java title: Java 中你絕對沒用過的一個關鍵字? tagline: by 子悠 tags: 子悠 前面的文章給大家介紹瞭如何自定義一個不可變類,沒看過的小伙伴建議去看一下,這節課給大家介紹一個 Java 中的一個關鍵字 Record,那 ...



layout: post
categories: Java
title: Java 中你絕對沒用過的一個關鍵字?
tagline: by 子悠
tags:

  • 子悠

前面的文章給大家介紹瞭如何自定義一個不可變類,沒看過的小伙伴建議去看一下,這節課給大家介紹一個 Java 中的一個關鍵字 Record,那 Record 關鍵字跟不可變類有什麼關係呢?看完今天的文章你就知道了。友情提示 Record 關鍵字在 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;
  }
}

如果你複製上面代碼到 IDEA 中,並且剛好你的 JDK 版本是 Java14 之後的話,那麼你就會看到下麵這個提示,提示我們可以將 Teacher 這個不可變類轉換為 Record。怎麼樣是不是很懵,沒關係,我們按照提示操作一下看看會發生什麼。

點完之後我們的代碼會變成下麵的樣子

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;
  }
}

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

Record 關鍵字

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

  1. Record 關鍵定義的類是不可變類;
  2. Record 定義的類需要將所有成員變數通過參數的形式定義;
  3. Record 定義的類預設會生成全部參數的構造方法;
  4. Record 定義的類中可以定義靜態方法;
  5. Record 定義的類可以提供緊湊的方式進行參數校驗;

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

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

下麵我們看下第四點和第五點,關於第四點我們可以在 Record 類中定義靜態方法用來預設初始化對象,如下所示,通過這種方式我們可以寫出更簡潔的代碼。

  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<>());
  }

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

 Teacher teacher = Teacher.of();

接下來我們看看什麼叫緊湊的方式進行參數校驗,試想一下,如果我們需要校驗在溝通 Teacher 對象的時候,student 成員變數不能為空,在我們以前的寫法裡面只要在構造方法裡面進行一下判空就可以了,但是對於 Record 的形式,我們沒有顯示的創建構造方法,那我們應該如何進行判斷呢?答案如下

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

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

總結

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

更多優質內容歡迎關註公眾號【Java 極客技術】,我準備了一份面試資料,回覆【bbbb07】免費領取。希望能在這寒冷的日子里,幫助到大家。

本文來自博客園,作者:zi-you,轉載請註明原文鏈接:https://www.cnblogs.com/zi-you/p/16936858.html


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 淺入淺出JS垃圾回收機制 前置概念 再講垃圾回收機制之前需要明白兩個知識點: 原始值和引用值 ECMASCRIPT變數可以包含兩種不同的類型數據:原始值和引用值。 原始值就是最簡單的數據,有六種:Undefined、Null、Boolean、Number、String和Symbol。 保存原始值得變 ...
  • 前言: 前天我們學了 ref 和 reactive ,提到了響應式數據和 Proxy ,那我們今天就來瞭解一下,vue3 的響應式 在瞭解之前,先複習一下之前 vue2 的響應式原理 vue2 的響應式: 原理: 對象類型:通過 Object.defineProperty() 對象的讀取,修改進行攔 ...
  • <!-- 設置頁面編碼格式,中文問題--> <meta http-equiv="Content-Type" content="text/html; charset="utf-8" /> <!-- 強制文檔寬度與設備寬度保持1:1,且文檔最大寬度比例是1.0,不允許用戶點擊屏幕放大瀏覽,用戶是否可以手 ...
  • 基本描述 CSS偽類是很常用的功能,主要應用於選擇器的關鍵字,用來改變被選擇元素的特殊狀態下的樣式。 偽類類似於普通CSS類的用法,是對CSS選擇器的一種擴展,增強選擇器的功能。 目前可用的偽類有大概40多個,少部分有相容性問題。我們比較常見的,如::hover、:root、:first-child ...
  • 〇、參考資料 1、hutool介紹 https://blog.csdn.net/abst122/article/details/124091375 2、Spring Boot+Mybatis實現登錄註冊 https://www.cnblogs.com/wiki918/p/16221758.html ...
  • Filter過濾器02 5.Filter過濾器生命周期 Filter生命周期圖解 驗證-Tomcat來創建Filter實例,只會創建一個實例 package com.filter; import javax.servlet.*; import javax.servlet.http.HttpServl ...
  • 以前學習的過程中,有聽過 EasyExcel 這麼一個東西,不過從來沒用過,所以,正好藉此機會學習,看看如何使用它來實現需求。 在學習 EasyExcel 的這段時間里,也瞭解到工作中這種導入導出的需求還是挺常見的,所以決定記錄下來。 ...
  • 一.小結 1.字元串是封裝在String類中的對象。要創建一個字元串,可以使用11種構造方法之一,也可以使用字元串直接量進行簡捷初始化。 2.String對象是不可變的,它的內容不能改變。為了提高效率和節省記憶體,如果兩個直接量字元串有相同的字元序列,Java虛擬機就將它們存儲在一個對象中。這個獨特的 ...
一周排行
    -Advertisement-
    Play Games
  • 前言 在我們開發過程中基本上不可或缺的用到一些敏感機密數據,比如SQL伺服器的連接串或者是OAuth2的Secret等,這些敏感數據在代碼中是不太安全的,我們不應該在源代碼中存儲密碼和其他的敏感數據,一種推薦的方式是通過Asp.Net Core的機密管理器。 機密管理器 在 ASP.NET Core ...
  • 新改進提供的Taurus Rpc 功能,可以簡化微服務間的調用,同時可以不用再手動輸出模塊名稱,或調用路徑,包括負載均衡,這一切,由框架實現並提供了。新的Taurus Rpc 功能,將使得服務間的調用,更加輕鬆、簡約、高效。 ...
  • 順序棧的介面程式 目錄順序棧的介面程式頭文件創建順序棧入棧出棧利用棧將10進位轉16進位數驗證 頭文件 #include <stdio.h> #include <stdbool.h> #include <stdlib.h> 創建順序棧 // 指的是順序棧中的元素的數據類型,用戶可以根據需要進行修改 ...
  • 前言 整理這個官方翻譯的系列,原因是網上大部分的 tomcat 版本比較舊,此版本為 v11 最新的版本。 開源項目 從零手寫實現 tomcat minicat 別稱【嗅虎】心有猛虎,輕嗅薔薇。 系列文章 web server apache tomcat11-01-官方文檔入門介紹 web serv ...
  • C總結與剖析:關鍵字篇 -- <<C語言深度解剖>> 目錄C總結與剖析:關鍵字篇 -- <<C語言深度解剖>>程式的本質:二進位文件變數1.變數:記憶體上的某個位置開闢的空間2.變數的初始化3.為什麼要有變數4.局部變數與全局變數5.變數的大小由類型決定6.任何一個變數,記憶體賦值都是從低地址開始往高地 ...
  • 如果讓你來做一個有狀態流式應用的故障恢復,你會如何來做呢? 單機和多機會遇到什麼不同的問題? Flink Checkpoint 是做什麼用的?原理是什麼? ...
  • C++ 多級繼承 多級繼承是一種面向對象編程(OOP)特性,允許一個類從多個基類繼承屬性和方法。它使代碼更易於組織和維護,並促進代碼重用。 多級繼承的語法 在 C++ 中,使用 : 符號來指定繼承關係。多級繼承的語法如下: class DerivedClass : public BaseClass1 ...
  • 前言 什麼是SpringCloud? Spring Cloud 是一系列框架的有序集合,它利用 Spring Boot 的開發便利性簡化了分散式系統的開發,比如服務註冊、服務發現、網關、路由、鏈路追蹤等。Spring Cloud 並不是重覆造輪子,而是將市面上開發得比較好的模塊集成進去,進行封裝,從 ...
  • class_template 類模板和函數模板的定義和使用類似,我們已經進行了介紹。有時,有兩個或多個類,其功能是相同的,僅僅是數據類型不同。類模板用於實現類所需數據的類型參數化 template<class NameType, class AgeType> class Person { publi ...
  • 目錄system v IPC簡介共用記憶體需要用到的函數介面shmget函數--獲取對象IDshmat函數--獲得映射空間shmctl函數--釋放資源共用記憶體實現思路註意 system v IPC簡介 消息隊列、共用記憶體和信號量統稱為system v IPC(進程間通信機制),V是羅馬數字5,是UNI ...