写点什么

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:0019666

评论

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

Lazada商品详情数据接口API使用教程:轻松集成,高效管理

tbapi

lazada商品详情数据接口 lazada API lazada商品数据采集 lazada

第三季度加密市场动荡:市场缺乏炒作题材,波动加剧

区块链软件开发推广运营

dapp开发 区块链开发 链游开发 NFT开发 公链开发

Autobots应用探索:实践中的思考与发现

京东科技开发者

云灾备场景

天翼云开发者社区

公有云 容灾场景

【堡垒机小知识】堡垒机可以定期自动修改主机密码吗?

行云管家

等保 堡垒机 等级保护

欢迎来到 Mint Expedition:Web3 和 NFT 的新时代开始

NFT Research

blockchain NFT\

TaD+RAG-缓解大模型“幻觉”的组合新疗法

京东科技开发者

从校招新星到前端技术专家的成长之路

京东科技开发者

【YashanDB知识库】数据变化率超过阈值统计信息失效

YashanDB

yashandb 崖山数据库 崖山DB

揭秘快手商品详情数据接口:数据驱动的商业决策新利器

tbapi

快手商品详情数据接口 快手API接口 快手商品数据采集

【YashanDB知识库】应用绑定参数的慢查询,慢日志抓取不到

YashanDB

yashandb 崖山数据库 崖山DB

Databend 开源周报第 153 期

Databend

堡垒机小知识之堡垒机使用范围讲解

行云管家

网络安全 数据安全 等保 堡垒机

爆火的无人驾驶萝卜快跑,背后有哪些隐忧?

博文视点Broadview

【YashanDB知识库】同时设置默认值和非空约束时报错YAS-02070

YashanDB

yashandb 崖山数据库 崖山DB

性能测试:性能测试报告

测吧(北京)科技有限公司

测试

火山引擎多重优势,助力企业出海抓住 AI 新机遇

新消费日报

性能测试:性能测试报告

测试人

软件测试

LED租赁系列与舞台“融为一体”

Dylan

技术 灯光秀 LED LED display LED显示屏

淘宝/天猫商品详情API接口在跨境电商数据采集中的应用

技术冰糖葫芦

API 安全 API 文档 API 开发 API 协议

性能测试:性能测试报告

霍格沃兹测试开发学社

基于MindSpore实现BERT对话情绪识别

华为云开发者联盟

人工智能 深度学习 华为云 华为云开发者联盟 企业号2024年7月PK榜

rbd常用的配置参数

天翼云开发者社区

rbd 配置参数

利用财务工具实现企业不同阶段的有效规划

智达方通

全面预算管理 预算管理 财务预算

【YashanDB知识库】数据库审计shutdown immediate操作导致数据库异常退出

YashanDB

yashandb 崖山数据库 崖山DB

从校招新星到前端技术专家的成长之路

京东零售技术

前端 企业号2024年7月PK榜

国际营销内容

cts喜友科技

营销 国际营销

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