HarmonyOS开发者限时福利来啦!最高10w+现金激励等你拿~ 了解详情
写点什么

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

评论

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

云原生之旅:一年的变革、成长与启示

熬夜磕代码、

区块链铭文系统开发详情

l8l259l3365

分布式基础概念-消息中间件[RabbitMQ]

派大星

Java 面试题

mac专业视觉特效包处理工具 FxFactory pro 8 激活最新版

mac大玩家j

Mac软件 视觉特效插件

AnyGo for Mac(虚拟定位软件) 6.9永久激活版

mac

苹果mac Windows软件 虚拟定位软件 AnyGo

从根上理解elasticsearch(lucene)查询原理(1)-lucece查询逻辑介绍

EquatorCoco

Elastic Stack 查询 优化工具

持续测试性能的方法

敏捷开发

DevOps 性能测试 自动化测试 CD 持续测试

华为云CodeArts Artifact:保障制品质量与安全的最佳选择

华为云PaaS服务小智

云计算 软件开发 华为云

注册中心元数据的应用

姚秋实(Nacol)

Java 架构 配置中心 元数据 metadata

新型生成式 AI 助手 Amazon Q 为 IT 专业人士与开发人员提供有力支持(预览版)

亚马逊云科技 (Amazon Web Services)

re:Invent Amazon EC2 生成式人工智能 Amazon Lambda Amazon Chatbot

KaiwuDB 获评信通院 2023 大数据“星河”标杆案例

KaiwuDB

KaiwuDB “星河”标杆案例

浪潮云连续2年跻身中国分布式云市场领导者象限

云计算 数据云

大算力与大模型的融合之力

百度开发者中心

nlp 大模型

软件测试/人工智能丨Spark开发分布式造数,构建大规模测试数据

测试人

人工智能 软件测试

【等保】安徽省等保测评机构名单看这里!

行云管家

等保 等级保护 等保测评 安徽

语音数据集:AI语音技术的基石

来自四九城儿

31 | 深度和广度优先搜索:如何找出社交网络中的三度好友关系

鲁米

语音数据集:为AI注入听觉的力量

来自四九城儿

软件测试/人工智能/PyTorch技术在软件测试中的应用

测试人

人工智能 软件测试

从互联网到云计算再到 AI 原生,百度智能云数据库的演进

百度Geek说

人工智能 云计算 云原生 企业号12月PK榜

Wireshark使用技巧

小齐写代码

如何为3D模型导入材质贴图

3D建模设计

3D渲染 纹理贴图 材质编辑

软件测试/人工智能丨掌握视觉CV处理技术对软件测试工作的帮助

测试人

人工智能 软件测试

3D模型材质丢失怎么办?

3D建模设计

3D渲染 材质贴图 材质编辑

【教程】制作 iOS 推送证书

雪奈椰子

语音数据集:推动AI语音技术的核心力量

来自四九城儿

OpenHarmony创新赛人气投票活动,最佳人气作品由你来定!

OpenHarmony开发者

OpenHarmony

2024年程序员必须掌握的10款开发工具

伤感汤姆布利柏

敏捷开发 低代码 开发工具 测试工具 前端开发工具

Fine-tuning: 一种针对大模型的优化策略

百度开发者中心

nlp 大模型

低多边形植物模型法线贴图

3D建模设计

3D渲染 材质贴图 纹理贴图 材质纹理 材质编辑

优化大模型的关键策略

百度开发者中心

大模型 深度学习、

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