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
  • Dapr Outbox 是1.12中的功能。 本文只介紹Dapr Outbox 執行流程,Dapr Outbox基本用法請閱讀官方文檔 。本文中appID=order-processor,topic=orders 本文前提知識:熟悉Dapr狀態管理、Dapr發佈訂閱和Outbox 模式。 Outbo ...
  • 引言 在前幾章我們深度講解了單元測試和集成測試的基礎知識,這一章我們來講解一下代碼覆蓋率,代碼覆蓋率是單元測試運行的度量值,覆蓋率通常以百分比表示,用於衡量代碼被測試覆蓋的程度,幫助開發人員評估測試用例的質量和代碼的健壯性。常見的覆蓋率包括語句覆蓋率(Line Coverage)、分支覆蓋率(Bra ...
  • 前言 本文介紹瞭如何使用S7.NET庫實現對西門子PLC DB塊數據的讀寫,記錄了使用電腦模擬,模擬PLC,自至完成測試的詳細流程,並重點介紹了在這個過程中的易錯點,供參考。 用到的軟體: 1.Windows環境下鏈路層網路訪問的行業標準工具(WinPcap_4_1_3.exe)下載鏈接:http ...
  • 從依賴倒置原則(Dependency Inversion Principle, DIP)到控制反轉(Inversion of Control, IoC)再到依賴註入(Dependency Injection, DI)的演進過程,我們可以理解為一種逐步抽象和解耦的設計思想。這種思想在C#等面向對象的編 ...
  • 關於Python中的私有屬性和私有方法 Python對於類的成員沒有嚴格的訪問控制限制,這與其他面相對對象語言有區別。關於私有屬性和私有方法,有如下要點: 1、通常我們約定,兩個下劃線開頭的屬性是私有的(private)。其他為公共的(public); 2、類內部可以訪問私有屬性(方法); 3、類外 ...
  • C++ 訪問說明符 訪問說明符是 C++ 中控制類成員(屬性和方法)可訪問性的關鍵字。它們用於封裝類數據並保護其免受意外修改或濫用。 三種訪問說明符: public:允許從類外部的任何地方訪問成員。 private:僅允許在類內部訪問成員。 protected:允許在類內部及其派生類中訪問成員。 示 ...
  • 寫這個隨筆說一下C++的static_cast和dynamic_cast用在子類與父類的指針轉換時的一些事宜。首先,【static_cast,dynamic_cast】【父類指針,子類指針】,兩兩一組,共有4種組合:用 static_cast 父類轉子類、用 static_cast 子類轉父類、使用 ...
  • /******************************************************************************************************** * * * 設計雙向鏈表的介面 * * * * Copyright (c) 2023-2 ...
  • 相信接觸過spring做開發的小伙伴們一定使用過@ComponentScan註解 @ComponentScan("com.wangm.lifecycle") public class AppConfig { } @ComponentScan指定basePackage,將包下的類按照一定規則註冊成Be ...
  • 操作系統 :CentOS 7.6_x64 opensips版本: 2.4.9 python版本:2.7.5 python作為腳本語言,使用起來很方便,查了下opensips的文檔,支持使用python腳本寫邏輯代碼。今天整理下CentOS7環境下opensips2.4.9的python模塊筆記及使用 ...