字符串模板被噶了,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.mzph.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…