項目升級啦

公司要新做一個醫療行業的業務,經過業務端和產品端的評估該業務與公司已有的產品線關聯不大,用戶后續也不想在老系統那臺老爺車上繼續使用,話說老系統到現在差不多10年了,中間經歷過的前后端開發者形形色色,維護者換了一輪又一輪,系統已經日漸臃腫,頁面UI也不大美觀,作為技術研發人員也表示能夠理解。而且從技術的角度考慮,新系統中除了要研發的新業務外,它所依賴的基礎模塊與傳統的權限管理模式也大不相同,強行在原系統上研發的話,基礎模塊的重新搭建也是必不可少,到時候難免把原系統改的面目全非。經過綜合考慮覺得重新搭建一套系統,前后端應用均從0開始研發。

新搭建的項目那java8肯定是不能再用了,技術人員也要跟上時代進步的步伐,果斷安排上了springboot3和java17。說來也慚愧,我雖然是研發的老司機了,可新版本的jdk還沒有在項目中實際使用過,這次研發新項目方才真正實踐其中的一些新特性。

Records(數據類)

Records 是 Java 14 中作為預覽功能引入,并在 Java 16 中正式成為永久特性的新功能。它的主要目的是簡化不可變數據載體類(Data Carrier Class)的創建。這類類通常只包含數據字段,并提供訪問這些字段的方法,而沒有復雜的行為。

Records 出現之前,我們通常需要手動編寫一個 POJO(Plain Old Java Object)類,包含私有字段、構造函數、getter 方法、equals()hashCode()toString() 方法。這不僅繁瑣,而且容易出錯。Records 正是為了解決這個問題而設計的。

1. 什么是 Record?

Record 是一種特殊的類,它代表其狀態是其唯一有意義的特征的不可變數據。它自動為你生成:

  • 私有、final 的字段:對應于 record 頭部中聲明的組件。
  • 公共構造函數:參數與 record 組件的順序和類型相同,用于初始化字段。
  • 公共的 accessor 方法(訪問器):對于每個組件 x,會生成一個名為 x() 的方法(注意:不是 getX()),返回該字段的值。
  • equals(Object o) 方法:基于所有字段的值進行比較。
  • hashCode() 方法:基于所有字段的值生成哈希碼。
  • toString() 方法:生成包含類名和所有字段名及其值的字符串表示。

2. 基本語法

public record Person(String name, int age) {// record body (可選)
}

這個簡單的聲明等價于以下傳統類:

// 等價的傳統寫法
public final class Person {private final String name;private final int age;public Person(String name, int age) {this.name = name;this.age = age;}public String name() { // 注意:是 name() 而不是 getName()return name;}public int age() { // 注意:是 age() 而不是 getAge()return age;}// 自動生成的 equals, hashCode, toString...// ... (代碼省略)
}

3. 使用 Record

public class RecordUseDemo {public static void main(String[] args) {// 創建 record 實例Person person = new Person("Alice", 30);// 訪問字段 (使用 accessor 方法)System.out.println(person.name()); // 輸出: AliceSystem.out.println(person.age());  // 輸出: 30// toString()System.out.println(person); // 輸出: Person[name=Alice, age=30]// equals() 和 hashCode()Person person2 = new Person("Alice", 30);System.out.println(person.equals(person2)); // 輸出: trueSystem.out.println(person.hashCode() == person2.hashCode()); // 輸出: true}
}

4. Record 的特性與限制

  • 隱式 finalRecord 類是隱式 final 的,不能被繼承。
  • 隱式 publicRecord 類和其組件(字段)是隱式 public 的。
  • 不可變性:所有字段都是 private final 的,確保了 Record 實例的不可變性。
  • 無繼承Record 不能 extends 其他類(因為它隱式繼承了 java.lang.Record)。
  • 只能實現接口Record 可以 implements 接口。
  • 緊湊的構造函數:可以編寫“緊湊構造函數”來對參數進行驗證或預處理,但不能聲明自己的字段。
public record Person(String name, int age) {// 緊湊構造函數 - 用于驗證public Person {if (age < 0) {throw new IllegalArgumentException("Age cannot be negative");}// 注意:這里不能寫 this.name = name; 或 this.age = age;// 字段的賦值由編譯器自動完成// 你只能進行驗證或修改組件值(通過 this(...) 調用其他構造函數,但 record 通常只有一個構造函數)// 或者調用 super(...),但 record 沒有顯式父類構造函數可調用。}// 你也可以添加靜態方法或實例方法public boolean isAdult() {return age >= 18;}
}
  • 可以添加方法:可以在 Record 中添加靜態方法、實例方法、甚至 getter/setter(盡管 setter 會破壞不可變性,不推薦)。
public record Point(int x, int y) {// 靜態方法public static Point origin() {return new Point(0, 0);}// 實例方法public double distanceToOrigin() {return Math.sqrt(x * x + y * y);}// 可以重寫自動生成的方法@Overridepublic String toString() {return "Point(" + x + ", " + y + ")";}
}

實踐示例

在數據層的Maaper中定義數據類User, 用于查詢接口的方法返回對象。

public interface MessageMapper {/*** 用戶對象* @param id* @param name*/record User(String id, String name) {}/*** 獲取發信人* @param messageId* @return*/User getSendUser(Long messageId);
}

Text Blocks(多行字符串)


使用三重引號(""")定義多行字符串,避免轉義字符。簡便了大段的文本處理效率,不用再檢查字符串“+”拼接中的引號是否對稱等特殊字符字符轉義問題啦。
示例:

  // java8 之前的寫法String s1 = "{\"name\":\"John\",\"age\":30}";// java 14 引入的寫法String s2= """{"name": "John","age": 30}""";

應用場景:JSON/XML配置、SQL語句拼接,提升可讀性。

Switch表達式


支持模式匹配和表達式返回值,替代傳統switch語句。真是三目運算符的好幫手,寫過三目運算符的都知道,有時候僅僅是多一個值選項就不得不轉換為各種if else的嵌套寫法,可以這樣使用switch之后,寫法真的簡便很多。
示例

    int days=0;//java8 之前的寫法switch (month) {case "JANUARY":case "MARCH":case "MAY":case "JULY":case "AUGUST":case "OCTOBER":case "DECEMBER":days = 31;break;case "APRIL":case "JUNE":case "SEPTEMBER":case "NOVEMBER":days = 30;break;case "FEBRUARY":days = 28;break;default:System.out.println("Invalid month.");break;}//java14之后的寫法days = switch (month) {case "JANUARY", "MARCH", "MAY", "JULY", "AUGUST", "OCTOBER", "DECEMBER" -> 31;case "APRIL", "JUNE", "SEPTEMBER", "NOVEMBER" -> 30;case "FEBRUARY" -> 28;default -> throw new IllegalArgumentException("Invalid month: " + month);};

應用場景:狀態機處理(如訂單狀態流轉)。

以上就是我這邊的使用過程和經歷啦,后面項目中有其他特性應用再行補充和說明了。關于本文的內容和個人的使用經歷,也歡迎大家在評論區留言和交流。

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/diannao/93871.shtml
繁體地址,請注明出處:http://hk.pswp.cn/diannao/93871.shtml
英文地址,請注明出處:http://en.pswp.cn/diannao/93871.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Android中頁面生命周期變化

一、Activity切換的生命周期變化&#xff08;A啟動B&#xff09;1. 標準流程&#xff08;B完全覆蓋A&#xff09;完整生命周期路徑&#xff1a;Activity A&#xff1a;onPause()&#xff1a;失去焦點&#xff0c;仍部分可見onStop()&#xff1a;完全不可見&#xff08;當B完全覆…

自動駕駛控制算法——PID算法

自動駕駛控制算法——PID算法 文章目錄自動駕駛控制算法——PID算法一、PID 是什么&#xff1f;二、PID 原理2.1 **比例環節&#xff08;P&#xff09;**2.2 **積分環節&#xff08;I&#xff09;**2.3 **微分環節&#xff08;D&#xff09;**2.4 特點總結2.5 案例分析 —— 小…

Spring Boot 異步執行方式全解析:@Async、CompletableFuture 與 TaskExecutor 對比

在 Spring Boot 開發中&#xff0c;異步執行是提升系統性能的重要手段&#xff0c;尤其適用于處理耗時操作&#xff08;如日志記錄、郵件發送、數據同步等&#xff09;。本文將深入對比 Spring Boot 中三種主流的異步實現方式 ——Async注解、手動CompletableFuture和直接使用T…

高效微調2:Prompt-Tuning原理與實戰

高效微調2:Prompt-Tuning原理與實戰 Prompt-Tuning原理介紹 代碼 Prompt-Tuning原理介紹 Prompt-Tuning Prompt-Tuning的思想:凍結主模型全部參數,在訓練數據前加入一小段Prompt,只訓練Prompt的表示層,即一個Embedding模塊。其中,Prompt.又存在兩種形式,一種是hard promp…

使用BART模型和T5模型實現文本改寫

BART模型BART&#xff08;Bidirectional and Auto-Regressive Transformers&#xff09;是由 Facebook AI Research&#xff08;FAIR&#xff09;在 2019 年提出的序列到序列&#xff08;seq2seq&#xff09;預訓練模型&#xff0c;論文發表于《BART: Denoising Sequence-to-Se…

電商前端Nginx訪問日志收集分析實戰

使用FileBeatLogstashES實現分布式日志收集 在大型項目中 &#xff0c;往往服務都是分布在非常多不同的機器上 &#xff0c;每個機器都會打印自己的log日志 但是 &#xff0c;這樣分散的日志 &#xff0c;本來就無法進行整體分析。再加上微服務的負載均衡體系 &#xff0c;甚至…

TwinCAT3示例項目1

目錄一、需求分析二、程序編寫1.實現1盞燈的自控&#xff08;IF、TOF&#xff09;2. 添加模式控制&#xff08;Case、枚舉&#xff09;3. 添加多盞燈&#xff08;FOR、數組&#xff09;4. 添加多組燈&#xff08;二維數組&#xff09;END項目結合了&#xff0c;FB&#xff0c;I…

如何在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能

這篇文章詳細介紹了如何在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能&#xff0c;通過 PCI 設備直通&#xff08;Pass-Through&#xff09;技術將顯卡分配給虛擬機使用&#xff1a; 在 VMware Workstation 虛擬機中利用 Nvidia 顯卡的硬件加速功能 1. 檢查…

設計模式(二十二)行為型:策略模式詳解

設計模式&#xff08;二十二&#xff09;行為型&#xff1a;策略模式詳解策略模式&#xff08;Strategy Pattern&#xff09;是 GoF 23 種設計模式中最具實用性和廣泛影響力的行為型模式之一&#xff0c;其核心價值在于定義一系列算法或行為&#xff0c;并將每個算法封裝到獨立…

AI+向量化

要理解 Java 如何結合 AI 與向量化&#xff0c;我們需要從向量化的核心概念、AI 中向量化的作用、Java 生態中的實現工具以及具體實踐案例四個維度展開。以下是詳細解析&#xff1a;一、核心概念&#xff1a;向量化與 AI 的關系向量化&#xff08;Vectorization&#xff09;是將…

Bootstap Vue 之b-form-radio-group 不顯示選中狀態問題

代碼類似&#xff1a;<b-form-radio-groupclass"mt-2"required:disabled"dfrmDisabled"v-model"childDikeForm.SafetyAppraisalRank":options"[一, 二, 三, 四]"name"rankradioopt"></b-form-radio-group>經過測…

Shell 腳本實戰:基于 for 循環的批量操作三例(賬戶創建、網絡檢測與密碼管理)

一、編寫腳本for1.sh,使用for循環創建20賬戶&#xff0c;賬戶名前綴由用戶從鍵盤輸入&#xff0c;賬戶初始密碼由用戶輸入&#xff0c;例如:test1、test2、test3、......、test10實現思路通過read命令獲取用戶輸入的賬戶前綴和初始密碼&#xff1b;加入非空校驗&#xff1a;若前…

PBR技術

一 、PBR的概述1.定義策略路由&#xff1a; PBR 是一種覆蓋路由器默認路由決策機制的技術。它允許管理員根據策略&#xff08;而不僅僅是目標地址&#xff09;來設置數據包的下一跳 IP 地址、出站接口、IP 優先級/DSCP 值等。路由策略&#xff1a;是指在路由器或三層設備上&…

STM32-ESP8266Wi-Fi模塊使用USART實現通信/創建AP和STA模式配置教程(寄存器版)

本章思維導圖&#xff1a;ESP8266WIFI模塊簡介ESP8266 是一款由樂鑫科技推出的低成本、高性能 Wi-Fi 模塊&#xff0c;廣泛應用于物聯網和嵌入式開發領域。WIFI的頻段5G和2.4G2.4G Wi-Fi與5G Wi-Fi最本質的區別即工作頻段&#xff08;無線電波的頻率&#xff09;不一樣&#xf…

算法26. 刪除有序數組中的重復項

給你一個 非嚴格遞增排列 的數組 nums &#xff0c;請你 原地 刪除重復出現的元素&#xff0c;使每個元素 只出現一次 &#xff0c;返回刪除后數組的新長度。元素的 相對順序 應該保持 一致 。然后返回 nums 中唯一元素的個數。 考慮 nums 的唯一元素的數量為 k &#xff0c;你…

ROS2中傳輸樣條曲線

在ROS2中傳輸樣條曲線需要解決兩個核心問題&#xff1a;**如何結構化表示曲線數據**和**如何高效傳輸**。以下是一套完整方案&#xff0c;結合自定義消息設計、序列化優化和QoS配置實現可靠傳輸&#xff1a;---### &#x1f4d0; 一、定義樣條曲線的自定義消息 樣條曲線通常由控…

Win11怎樣安裝DirectX 9

通過微軟官方下載安裝&#xff1a;確認系統兼容性并準備&#xff1a;確保顯卡驅動為最新版本&#xff0c;因為 DirectX 與顯卡驅動程序緊密相關。同時&#xff0c;可暫時關閉防病毒軟件和防火墻&#xff0c;防止其干擾安裝過程。下載安裝程序&#xff1a;訪問微軟官方網站下載 …

RAGFLOW~Enable RAPTOR

Enable RAPTOR 一種遞歸抽象方法&#xff0c;用于長上下文知識檢索和摘要&#xff0c;在廣泛語義理解和細微細節之間取得平衡。 RAPTOR&#xff08;遞歸抽象處理用于樹狀組織檢索&#xff09;是一種在2024年論文中引入的增強文檔預處理技術。它旨在解決多跳問答問題&#xff0c…

【機器人+相機通訊】宇樹科技相機通信

https://github.com/unitreerobotics/xr_teleoperate/blob/main/README_zh-CN.md 相機驅動與服務端 https://github.com/unitreerobotics/xr_teleoperate/blob/main/teleop/image_server/image_server.py 其中相機如果是realsense, 安裝好驅動后&#xff0c;可以使用命令查看…

機械學習中的一些優化算法(以邏輯回歸實現案例來講解)

一、混淆矩陣混淆矩陣是機器學習中評估分類模型性能的重要工具&#xff0c;尤其適用于二分類或多分類任務。它通過展示模型預測結果與實際標簽的匹配情況&#xff0c;幫助理解模型的錯誤類型&#xff08;如假陽性、假陰性等&#xff09;。以下通過二分類場景為例&#xff0c;結…