写点什么

Java 迎来增强功能字符串模板,代码简化,安全性提升

  • 2023-06-10
    北京
  • 本文字数:2409 字

    阅读完需:约 8 分钟

Java迎来增强功能字符串模板,代码简化,安全性提升

面向 JDK 21 的 JEP 430(字符串模板预览)已经从 Proposed to Target 状态提升到 Targeted 状态。该 JEP 提议用字符串模板来增强 Java 编程语言。字符串模板类似于字符串字面量,但包含嵌入式表达式,这些表达式会在运行时合并到字符串模板中。

 

现在,Java 开发人员可以使用字符串模板增强该语言的字符串字面量和文本块。字符串模板将字面量文本与嵌入式表达式及处理器相结合,用于生成特定的结果。这一新特性的目的是简化 Java 程序的编写,提高文本和表达式混合代码的可读性,增强 Java 程序从用户提供的值组成字符串时的安全性。

 

该 JEP 引入了一种新的表达式,名为模板表达式,让开发人员可以安全有效地执行字符串插值及组合字符串。模板表达式是可编程的,其功能并不限于组合字符串。它们可以根据特定于领域的规则将结构化文本转换为任何类型的对象。在模板表达式中,模板处理器在运行时将模板中的字面量文本与嵌入表达式的值组合在一起生成所需的结果。请看下面的例子:

String name = "Joan";

String info = STR."My name is \{name}";assert info.equals("My name is Joan"); // true
复制代码

 

模板表达式的语法与字符串字面量类似,但有一个前缀。上述代码的第二行包含一个模板表达式。

 

相比之下,字符串插值通常允许程序员将字符串字面量和表达式组合成单个字符串,就像许多编程语言所做的那样,与传统的字符串连接相比,这样更方便也更清晰。但是,它会生成可能被其他系统误解的危险字符串,特别是在处理 SQL 语句、HTML/XML 文档、JSON 片段、shell 脚本和自然语言文本时。为了防止安全漏洞,Java 要求开发人员使用转义或验证方法对带有嵌入式表达式的字符串进行验证和消毒。

 

更安全、更有效的解决方案是引入一种基于模板的一等字符串组合机制,该机制会自动将特定于模板的规则应用于字符串,为 SQL 语句添加转义引号,让 HTML 文档没有非法实体,以及实现无模板的消息本地化。这种方法使开发人员不用再手动对每个嵌入式表达式进行转义,并验证整个字符串。这正是 Java 模板表达式所做的,与其他流行的编程语言所使用的字符串插值完全不同。

 

在模板表达式的设计中,包含嵌入式表达式的字符串字面量或文本块是不可能直接转换为插入了表达式值的字符串的。这是为了防止危险的错误字符串在程序中传播。取而代之,模板处理器(如 STRFMT RAW)会处理字符串字面量,验证结果,并插入嵌入式表达式的值。

 

下面是一些模板表达式的例子,它们使用多行来描述 HTML 文本、JSON 文本和一个区域表格:

String title = "My Web Page";String text  = "Hello, world";String html = STR."""        <html>          <head>            <title>\{title}</title>          </head>          <body>            <p>\{text}</p>          </body>        </html>        """;
复制代码

 

它生成以下输出:

| """| <html>|   <head>|     <title>My Web Page</title>|   </head>|   <body>|     <p>Hello, world</p>|   </body>| </html>| """
复制代码

 

下面是另一个例子:

String name    = "Joan Smith";String phone   = "555-123-4567";String address = "1 Maple Drive, Anytown";String json = STR."""    {        "name":    "\{name}",        "phone":   "\{phone}",        "address": "\{address}"    }    """;
复制代码

 

类似地,它生成以下输出:

| """| {|     "name":    "Joan Smith",|     "phone":   "555-123-4567",|     "address": "1 Maple Drive, Anytown"| }| """
复制代码

 

另一个例子:

record Rectangle(String name, double width, double height) {    double area() {        return width * height;    }}

Rectangle[] zone = new Rectangle[] { new Rectangle("Alfa", 17.8, 31.4), new Rectangle("Bravo", 9.6, 12.4), new Rectangle("Charlie", 7.1, 11.23), };

String form = FMT.""" Description Width Height Area %-12s\{zone[0].name} %7.2f\{zone[0].width} %7.2f\{zone[0].height} %7.2f\{zone[0].area()} %-12s\{zone[1].name} %7.2f\{zone[1].width} %7.2f\{zone[1].height} %7.2f\{zone[1].area()} %-12s\{zone[2].name} %7.2f\{zone[2].width} %7.2f\{zone[2].height} %7.2f\{zone[2].area()} \{" ".repeat(28)} Total %7.2f\{zone[0].area() + zone[1].area() + zone[2].area()} """;
复制代码

 

上述代码生成以下输出:

| """| Description     Width    Height     Area| Alfa            17.80    31.40      558.92| Bravo            9.60    12.40      119.04| Charlie          7.10    11.23       79.73|                              Total  757.69| "
复制代码

 

Java 提供了两个模板处理器来执行字符串插值:STRFMTSTR用它(字符串化)的值替换模板中的每个嵌入式表达式,而FMT会解释出现在嵌入式表达式左侧的格式说明符。格式说明符与java.util.Formatter中定义的格式说明符相同。如果需要未经处理的原始模板,则可以使用标准的RAW模板处理器。这个处理器只是简单地返回原始模板,不做任何插值或处理。

 

此外,开发人员还可以创建自己的模板处理器,用于模板表达式的处理。模板处理器是一个提供ValidatingProcessor功能接口的对象,它的类实现了ValidatingProcessor的单一抽象方法。该方法接受StringTemplate并返回一个对象。自定义模板处理器让开发人员可以在运行时执行验证并返回任何类型的对象,而不仅仅是字符串。

 

总之,Java 模板表达式使开发人员可以轻松、安全地进行字符串插值和字符串组合。


原文链接:

https://www.infoq.com/news/2023/04/java-gets-a-boost-with-string/


相关阅读:

Java 近期新闻:Java 28 岁、Payara、Micronaut 4.0-M5、Spring 更新

快速实现不打折扣的云原生 Java 应用

Record 模式提升了 Java,能实现更具表现力的编码


2023-06-10 08:0019656

评论

发布
暂无评论
发现更多内容

华为云CDN,助力安全企业下载服务,更好提升用户体验

路过的憨憨

华为云CDN提升网站响应速度,让下载快人一步

路过的憨憨

什么是3D可视化,为什么要使用3D可视化

3DCAT实时渲染

Unity 3D渲染 3D可视化

阿根廷夺冠梅西加冕,球场外视频平台角逐世界杯

易观分析

视频 足球 卡塔尔世界杯

架构中实时引擎与离线渲染的主要优势

3DCAT实时渲染

Unity 渲染 实时渲染 AEC

中国电信发布《天翼云安全白皮书》 打造高质量云网安全保障体系

极客天地

还在为数据存储而烦恼?不妨进来看看华为云对象存储服务OBS

清欢科技

RayLink测评 | 完全免费,功能超越同类付费远程控制软件!!

RayLink远程工具

远程控制软件 远程办公软件 远控软件

备受企业青睐的华为云CDN优势到底在哪?

路过的憨憨

华为云CDN加速服务,引领企业数字化发展潮流!

路过的憨憨

2022“易观之星”奖项公布,聚焦数字经济,助力数智创新

易观分析

金融 易观 颁奖

存储数据如何更省钱?华为云告诉你!

清欢科技

BI-数据可视化 | 年度干货合集

搞大屏的小北

数据可视化工具 BI 分析工具 BI分析 市场分析

大数据一站式服务,华为云大数据BI驱动企业业务线增长

秃头也爱科技

云渲染和自己的电脑渲染哪个好?

Renderbus瑞云渲染农场

云渲染

HTTP的四种认证方式

穿过生命散发芬芳

HTTP 12月月更

【冲破信息孤岛】华为云大数据BI,助力金融行业进行数字化转型

秃头也爱科技

推动企业稳定发现,华为云大数据助力能源企业纾困

秃头也爱科技

提升企业决策能力,华为云用大数据BI助力企业腾飞

秃头也爱科技

【从零开始学爬虫】采集全国历史天气数据

前嗅大数据

数据采集 爬虫软件 爬虫教程 爬虫入门 爬虫入门教程

既要速度与激情,也要稳定和安全,华为云CDN让你速度和安全兼得

路过的憨憨

阿里云弹性预测 AHPA:助力厨芯科技降本增效

阿里巴巴云原生

阿里云 云原生 弹性预测

敏捷技术实践之重构

FL STUDIO2023最新版本号21新变化

茶色酒

FL STUDIO20.9 FL Studio FL Studio 21

不止于大,华为云对象存储服务OBS的全能一面

清欢科技

什么是云仿真,云仿真平台有哪些好处

3DCAT实时渲染

虚拟仿真 实时云渲染 云仿真 三维仿真

即时通讯软件WorkPlus助力政企应用快速移动化

BeeWorks

软硬协同造就极致性能 天翼云紫金DPU打造为云而生的全新一代云计算体系结构

极客天地

企业内部使用的即时通讯软件有哪些?

BeeWorks

海量、安全、高可靠的华为云对象存储服务OBS,助力企业数据存储降本提效

清欢科技

华为云OBS对象存储:企业“上云”的好帮手

清欢科技

Java迎来增强功能字符串模板,代码简化,安全性提升_编程语言_A N M Bazlur Rahman_InfoQ精选文章