字符串模板被噶了,JDK 23 刪除了預覽功能“字符串模板”

之前出了一個視頻,介紹 JDK 23 中的新特性。之后我才發現,在 JDK 21 和 22 中的預覽功能“字符串模板(String Templates)”,在 JDK 23 中已經沒有了。字符串模板的相關代碼,已經被全部刪除了。

字符串模板的功能,Java 社區已經期待太久了。其他主流的編程語言,都提供了字符串插值的功能。Java 語言一直沒有,也確實說不過去。JDK 21 中字符串模板的出現,解決了這一長期問題。JDK 23 直接把字符串模板刪除,確實有點突然。

至于為什么要刪掉字符串模板,這個功能的開發者給出的理由是:字符串模板的當前設計存在一些問題,但是具體要怎么改,又缺乏足夠的共識,所以就直接先刪掉了。等再收集一些反饋,達成了足夠的共識之后,再把字符串模板加回來。

61d2bde81da359fe46f003139f5720bf.png

關于字符串模板設計上的問題,Brian Goetz 寫了一段很長的文字來說明,感興趣的人可以看原文。

d7ebdc6bd6a0e102d1cf0161504c9164.png

總的來說,現在的字符串模板的處理器的設計過于復雜,完全沒有必要。說到這里,我們再回顧一下字符串模板的設計,具體的內容可以看我之前的視頻。這里簡單地說一下。

字符串模板用 StringTemplate 來表示,一個字符串模板中可以包含表達式,比如,My name is \{name} 是一個字符串模板,其中 name 是表達式。StringTemplate.Processor 接口,把 StringTemplate 對象轉換成其他任意類型對象。內置的 Processor 實現 STR,把 StringTemplate 轉換成 String,也就是進行字符串插值。

Processor 設計的出發點是允許創建自定義的轉換器,把 StringTemplate 安全地轉換成其他類型的對象。舉例來說,可以創建一個名為 DB 的處理器,把 StringTemplate 轉換成 JDBC 中的 PreparedStatement。但是轉換成 PreparedStatement 并不是終點,實際的目的是執行 PreparedStatement,獲取數據庫查詢的結果。DB 處理器的一般使用方式類似下面這樣。這段代碼會被添加在數據庫查詢類的某個方法中。

var stmt = DB."";
stmt.executeQuery();

對于這樣的使用方式,完全可以去掉 Processor 的實現,把 Processor 的實現代碼直接添加到當前類中。當前方法改為接受一個 StringTemplate 類型的參數。修改之后的代碼如下所示。

ResultSet query(StringTemplate template) {var stmt = ; // DB 處理器的代碼實現return stmt.executeQuery();
}

新的實現完全去掉了 Processor 的實現類,更容易理解。當前的數據庫查詢類,很可能已經有一個 String 類型的參數來表示 SQL 語句,再添加一個 StringTemplate 類型的參數,從接口上來說很容易理解和使用。

ResultSet query(String sql)
ResultSet query(StringTemplate template)

另外一個例子是解析 JSON 字符串的 JSON 處理器,與其使用 StringTemplate 的Processor,還不如在解析 JSON 的類中,添加一個新的 parse 方法,參數是 StringTemplate。這樣在實現上更緊湊。

<T> T parse(StringTemplate template, Class<T> type)

總的來說,雖然 Processor 接口設計的出發點是好的,但是在實際使用中卻是多余的。

這里分成兩種情況,第一種情況是 Processor 產生的是最終的結果,需要被外部消費。這一類場景通常是把某種類型格式的字符串表示,解析成對象形式。如 JSON 和 XML 的解析。這一類的 Processor 實現,看似有一定的通用性,實際上,只需要在已有的 JSON 或 XML 的解析類上,添加一個以 StringTemplate 作為參數的方法即可。這樣更符合解析庫使用者的使用方式。

第二種情況是 Processor 產生的是中間結果,還需要后續的處理。這一類場景通常是使用字符串作為輸入,解析之后再進一步處理。典型的例子是上面介紹的數據庫查詢。Processor 的處理結果,并不會單獨拿出來使用。對于這一類情況,同樣可以添加一個以 StringTemplate 為參數的方法。使用 Processor 來實現實屬多此一舉,Processor 實現被復用的可能性也比較低。

綜上所述,把 StringTemplate 單獨拿出來使用就足夠了,Processor 接口實際上是多余的。

字符串模板因為設計上的問題,短時間內無法達成一致,被從 JDK 23 中刪除了。刪除的主要原因,是為了避免有更多的代碼使用這一有瑕疵的設計,導致以后修改起來更困難。


JDK 中的預覽功能,其出發點是為了對新的想法進行試驗,并獲取反饋。所以預覽功能被刪除,從流程上來說是合理的。但是負面的影響仍然是很大的。

一個預覽功能,從想法的產生,到設計,再到實現,并最終出現在 JDK 中,這是一個很漫長的過程,其中所花費的成本很高。預覽功能一旦進入到 JDK,就會有人去使用它。 一個預覽功能被刪除了,使用它的代碼都需要被修改。雖然使用預覽功能是風險自負,但是在 JDK 使用者的印象中,預覽功能的穩定性是足夠的。在過往的歷史中,預覽功能可能會有小的修改,但是總體的設計和實現是穩定的。提前使用預覽功能的風險其實很低。字符串模板這個預覽功能被刪除,打破了 JDK 用戶對于預覽功能的穩定性的預期。在這之后,大家再使用 JDK 的預覽功能,積極性就會低很多,因為不確定性變高了。從結果上來說,不利于 JDK 的預覽功能獲取到足夠的反饋。

以上就是 JDK 23 中,字符串模板被刪除所相關的內容。只能說,確實很意外。不過既然已經是既成事實,用了字符串模板的應用,需要考慮今后的兼容性問題。因為最早引入字符串模板的 Java 21 是 LTS 版本,應用預計會使用這個版本運行較長時間,因此可以考慮保留已有的使用字符串模板的代碼。下一個 Java 的 LTS 版本是 Java 25,不確定字符串模板是否會在 Java 25 回歸。

點擊【閱讀原文】查看OpenJDK郵件組中關于字符串模板被刪除的原始說明。

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

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

相關文章

Spring Boot 3.3 【二】Spring Boot自動配置機制深度解析

簡單動作&#xff0c;深刻聯結。在這技術海洋&#xff0c;我備好舟&#xff0c;等你揚帆。啟航吧&#xff01; &#x1f31f;點擊【關注】&#xff0c;解鎖定期的技術驚喜&#xff0c;讓靈感與知識的源泉不斷涌動。 &#x1f44d;一個【點贊】&#xff0c;如同心照不宣的默契&a…

Unity免費領場景多人實時協作地編2人版局域網和LAN聯機類似谷歌文檔協同合作搭建場景同步資產設置編輯付費版支持10人甚至更多20240709

大家有沒有用過谷歌文檔、石墨文檔、飛書文檔等等之類的協同工具呢&#xff1f; Blender也有類似多人聯機建模的插件&#xff0c; Unity也有類似的多人合作搭建場景的插件啦。 剛找到一款免費插件&#xff0c;可以支持2人局域網和LAN聯機地編。 付費的版本支持組建更大的團隊。…

詳解如何通過稀疏向量優化信息檢索

在信息檢索方法的發展歷程中&#xff0c;我們見證了從傳統的統計關鍵詞匹配到如 BERT 這樣的深度學習模型的轉變。雖然傳統方法提供了堅實的基礎&#xff0c;但往往難以精準捕捉文本的語義關系。如 BERT 這樣的稠密檢索方法通過利用高維向量捕獲文本的上下文語義&#xff0c;為…

煙霧識別技術在火災預防中的應用:思通數科大模型的力量

引言 火災是導致生命財產損失的重大災害之一。早期檢測和快速響應是預防火災和減少損失的關鍵。結合思通數科大模型的煙霧識別技術&#xff0c;為實時檢測和精確定位煙霧來源提供了一種高效的解決方案。本文將探討這一技術如何有效預防火災并保障人員安全。 煙霧識別技術概述 …

注冊自定義總線

1、在/sys/bus下注冊一個自定義總線 #include<linux/module.h> #include<linux/init.h> #include<linux/kernel.h> #include<linux/kobject.h> #include<linux/slab.h> #include<linux/sysfs.h> #include<linux/device.h> #include…

bug修復 修復修復修復

好的&#xff0c;這里是更新后的代碼&#xff0c;將所有 inRange 函數的第一個變量替換為 ZoomOutimage&#xff1a; // 綠色分岔路 if (divergerColor "green" && nextColor "null") {cv::Mat frameGreen, frameRed;frame2.copyTo(frameGreen)…

如何在 Fedora 中使用 `shred` 擦除驅動器或文件

English Version: https://blog.csdn.net/sch0120/article/details/140390161 如何在 Fedora 中使用 shred 擦除驅動器或文件 安全擦除驅動器對于保護您的敏感數據免受未授權訪問至關重要。在這篇博文中&#xff0c;我們將學習如何在 Fedora 中使用 shred 命令安全擦除整個驅…

FATE Flow 源碼解析 - 作業提交處理流程

背景介紹 FATE 是隱私計算中最有名的開源項目了&#xff0c;從 star 的數量上來看也可以看出來。截止 2023 年 3 月共收獲 4.9k 個 star&#xff0c;但是 FATE 一直被認為代碼框架復雜&#xff0c;難以理解&#xff0c;作為一個相關的從業者&#xff0c;后續會持續對 FATE 項目…

React@16.x(56)Redux@4.x(5)- 實現 createStore

目錄 1&#xff0c;分析2&#xff0c;實現2.1&#xff0c;基礎實現2.2&#xff0c;優化2.2.1&#xff0c;隨機字符串2.2.2&#xff0c;action 的判斷2.2.2&#xff0c;監聽器的優化 2.3&#xff0c;最終形態 1&#xff0c;分析 createStore()&#xff0c;參數1為 reducer&…

0601STM32TIM

TOC 分為四部分&#xff0c;八小節 一部分&#xff1a;主要講定時器基本定時的功能&#xff0c;也就是定一個事件&#xff0c;讓定時器每隔這個時間產生一個中斷&#xff0c;來實現每隔一個固定時間來執行一段程序的目的&#xff0c;比如做一個時鐘、秒表&#xff0c;或者使用一…

【Linux】1w詳解如何實現一個簡單的shell

目錄 實現思路 1. 交互 獲取命令行 2. 子串分割 解析命令行 3. 指令的判斷 內建命令 4. 普通命令的執行 補充&#xff1a;vim 文本替換 整體代碼 重點思考 1.getenv和putenv是什么意思 2.代碼extern char **environ; 3.內建命令是什么 4.lastcode WEXITSTATUS(sta…

Java-final關鍵字詳解

Java-final關鍵字詳解 一、引言 二、什么是 final 關鍵字&#xff1f; 三、final 變量 final 局部變量 final 實例變量 final 靜態變量 四、final 方法 五、final 類 六、final 關鍵字的實際應用 1. 定義常量 2. 防止方法被重寫 3. 創建不可變類 4. 優化性能 七、…

切割01串(牛客小白月賽98)

題意&#xff1a; 給三個整數n&#xff0c;l&#xff0c;r&#xff0c;和一個字符串s&#xff0c;滿足l<|c0-c1|<r就可以切成字符串a和字符串b&#xff0c;c0為字符串a左側出現0的次數&#xff0c;c1為字符串b右側出現1的次數&#xff0c;求最多切割次數 知識點&#x…

Onnx 1-深度學習-概述1

Onnx 1-深度學習-概述1 一: Onnx 概念1> Onnx 介紹2> Onnx 的作用3> Onnx 應用場景4> Onnx 文件格式1. Protobuf 特點2. onnx.proto3協議3> Onnx 模型基本操作二:Onnx API1> 算子詳解2> Onnx 算子介紹三: Onnx 模型1> Onnx 函數功能

昇思學習打卡-8-計算機視覺/FCN圖像語義分割

目錄 FCN介紹FCN所用的技術訓練數據的可視化模型訓練模型推理FCN的優點和不足優點不足 FCN介紹 FCN主要用于圖像分割領域&#xff0c;是一種端到端的分割方法&#xff0c;是深度學習應用在圖像語義分割的開山之作。通過進行像素級的預測直接得出與原圖大小相等的label map。因…

【C++基礎】初識C++(2)--引用、const、inline、nullptr

目錄 一、引用 1.1 引用的概念和定義 1.2 引用的特性 1.3引用的使用 1.4 const引用 1.5 指針和引用的關系 二、inline 三、nullptr 一、引用 1.1 引用的概念和定義 引?不是新定義?個變量&#xff0c;?是給已存在變量取了?個別名&#xff0c;編譯器不會為引?…

微軟的人工智能語音生成器在測試中達到與人類同等水平

微軟公司開發了一種新的神經編解碼語言模型 Vall-E&#xff0c;在自然度、語音魯棒性和說話者相似性方面都超越了以前的成果。它是同類產品中第一個在兩個流行基準測試中達到人類同等水平的產品&#xff0c;而且顯然非常逼真&#xff0c;以至于微軟不打算向公眾開放。 VALL-E …

Node.js 模塊系統

Node.js 模塊系統 Node.js 的模塊系統是其核心特性之一,它允許開發者將代碼組織成可重用的模塊。這種系統促進了代碼的模塊化,使得大型應用程序的構建和管理變得更加容易。本文將深入探討 Node.js 的模塊系統,包括其工作原理、如何創建和使用模塊,以及模塊系統的優勢和局限…

【每日一練】python類和對象現實舉例詳細講解

""" 本節課程目的&#xff1a; 1.掌握類描述現實世界實物思想 2.掌握類和對象的關系 3.理解什么事面向對象 """ #比如設計一個鬧鐘&#xff0c;在這里就新建一個類 class Clock:idNone #鬧鐘的序列號&#xff0c;也就是類的屬性priceNone #鬧…

Git最常用操作速查表

Git常用操作 文章目錄 Git常用操作1. 克隆/拉取2. 分支操作1. 查看分支2. 創建分支3. 切換到分支4. 刪除分支5. 刪除遠程分支6. 推送分支到遠程 3. 暫存庫操作4. Git團隊規范1. 原則2. 分支設計3. commit備注一般規范 1. 克隆/拉取 git clone xxx 從遠程倉庫克隆 git rebase…