50万奖金+官方证书,深圳国际金融科技大赛正式启动,点击报名 了解详情
写点什么

JEP 443:未命名模式和变量致力于提升 Java 代码的可读性

  • 2023-06-23
    北京
  • 本文字数:1821 字

    阅读完需:约 6 分钟

JEP 443:未命名模式和变量致力于提升Java代码的可读性

JEP 443,未命名模式和变量(预览),已经从 JDK 21 的 Targeted 状态变更为 Completed 状态。这个预览 JEP 建议“用未命名的模式和未命名变量来增强语言,前者与记录组件相匹配,但无需说明组件的名称和类型,后者可以被初始化但不使用”。 这两者均由下划线字符表示,如r instanceof _(int x, int y)r instanceof _。这是一个预览的语言特性


未命名模式是为了简化数据处理,尤其是在处理记录类时。它们允许开发人员在模式匹配中省略记录组件的类型和名称,这可以显著提升代码的可读性。例如,考虑如下的代码片段:


 if (r instanceof ColoredPoint(Point p, Color c)) {    // ... }
复制代码


在这个样例中,如果在 if 代码块中不需要Color c组件,那么将其包含在模式中可能会很麻烦,而且不够清晰。有了 JEP 443,开发人员可以简单地省略不必要的组件,从而得到更干净、更易读的代码:


if (r instanceof ColoredPoint(Point p, _)) {    // ...}
复制代码


未命名变量在必须声明变量但是不使用它的值的情况下非常有用。这在循环、try-with-resources 语句、catch 代码块和 lambda 表达式中很常见。例如,考虑下面的循环:


  for (Order order : orders) {      if (total -> limit) total++;    }
复制代码


在本例中,order变量在循环中没有被用到。借助 JEP 443,开发人员可以使用下划线替换未使用的变量,使代码更加简洁明了:


for (_ : orders) {    if (total -> limit) total++;}
复制代码


未命名模式和变量是一个预览特性,默认是禁用的。要使用它,开发人员必须启用预览特性来编译代码,


如下面的命令所示:

javac --release 21 --enable-preview Main.java
复制代码


运行该程序也需要相同的标记:


java --enable-preview Main


但是,我们可以使用源码启动器(source code launcher)来直接运行它。在这种情况下,命令行如下所示:

java --source 21 --enable-preview Main.java
复制代码


使用jshell方案也是可以的,不过依然需要启用预览特性:

jshell --enable-preview
复制代码


我们来看看 JEP 443 介绍的关于未命名模式和变量的几个更高级的使用场景。


未命名模式在嵌套模式匹配的场景下特别有用,在这种情况下,一个记录类中只有某些组件是必需的。例如,考虑一个记录类ColoredPoint,它包含一个Point和一个Color。如果我们只需要Pointx坐标,那么可以使用未命名模式来省略yColor组件:


if (r instanceof ColoredPoint(Point(int x, _), _)) {    // ...}
复制代码


未命名模式变量在 switch 语句中非常有用,在这种情况下,相同的行为会在多种场景下运行,而变量不会被使用。例如:


switch (b) {    case Box(RedBall _), Box(BlueBall _) -> processBox(b);    case Box(GreenBall _) -> stopProcessing();    case Box(_) -> pickAnotherBox();}
复制代码


在本例中,前两个场景使用了未命名的模式变量,因为它们的右侧没有使用 box 组件。第三个场景使用了未命名模式,将 box 与 null 组件进行匹配。


未命名变量可以在参数无关紧要的 lambda 表达式中使用。例如,在下面的代码中,lambda 参数v没有被用到,所以它的名字无关紧要:


stream.collect(Collectors.toMap(String::toUpperCase, _ -> "No Data"));
复制代码


在 try-with-resources 语句中,资源代表了 try 块的代码执行的上下文。如果代码不直接使用上下文,资源变量的名称就无关紧要。比如:


try (var _ = ScopedContext.acquire()) {    // No use of acquired resource}
复制代码


未命名的变量可以在 catch 块中使用,其中异常参数的名称是无关紧要的。比如:

 try {    int i = Integer.parseInt(s); } catch (NumberFormatException _) {    System.out.println("Bad number: " + s);}
复制代码


值得注意的是,在 Java 10 中,下划线以前可以作为有效的标识符。但是,从 Java 8 开始,就不建议使用下划线作为标识符了,在 Java 9 中,下划线变成了一个编译时的错误。因此,我们认为,在现有的和积极维护的代码中,只有极少数会使用下划线作为变量名。如果确实存在这样的代码,就需要对其进行修改,避免使用下划线作为变量名。


鉴于此,JEP 443 朝着使 Java 代码更可读、更可维护迈出的重要一步。这在复杂的数据结构中尤为有益,因为结构的形状与结构中的数据项同等重要。通过允许开发人员省略不必要的组件和变量,它减少而来代码的混乱,使代码更易于理解。随着开发人员对这一特性获得更多的经验,预计它将成为 Java 编程的组成部分。


原文链接:

Streamlining Java with JEP 443: Ushering in a New Era of Java Code Readability


相关阅读:

JEP 444:JDK 21 中出现虚拟线程,开创并发新纪元

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

2023-06-23 08:003499

评论

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

研发排查问题的利器:一款方法调用栈跟踪工具

京东科技开发者

深度实测:完整代码生成 VS 片段式代码,差距有多大?

飞算JavaAI开发助手

为什么重写equals一定也要重写hashCode方法?

电子尖叫食人鱼

Java

Nacos源码—Nacos集群高可用分析

不在线第一只蜗牛

Java 前端 服务器

DApp 开发:开启去中心化应用新时代

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

1688 代采系统功能深度解析:如何通过自动采集商品详情数据 API 接口实现高效运营

代码忍者

1688 API

Hologres x 函数计算 x Qwen3,对接MCP构建企业级数据分析 Agent

阿里云大数据AI技术

大数据 数据分析 agent hologres Qwen3

英特尔与黑芝麻智能签署合作备忘录,联合发布舱驾融合平台

极客天地

如何在PPT中嵌入字体?办公常用的PPT技巧盘点!

职场工具箱

效率工具 PPT 办公软件 字体 AI生成PPT

分库分表后复杂查询的应对之道:基于DTS实时性ES宽表构建技术实践

京东科技开发者

Java 开发效率狂飙! 如何实现 3 小时交付项目

飞算JavaAI开发助手

天翼云息壤全面升级!

天翼云开发者社区

算力 智能云 息壤

2025年北京最值得去的互联网公司

测试人

人工智能

SpringBoot3整合SpringSecurity6(三)基于数据库的用户认证

电子尖叫食人鱼

oracle Spring Boot

AI大模型入门 (一):什么是大模型?

测试人

人工智能

副业搞钱新风口!靠 AI 写代码,程序员创收轻松破万

飞算JavaAI开发助手

企业内部IM即时通讯软件,如何解决公司安全办公问题?

BeeWorks

即时通讯IM 私有化部署 企业级应用

Timefold 前世今生:从 OptaPlanner 到更快更强的开源优化引擎

PeterOne

人工智能 AI 后端

惊!不会 AI 编程的 Java 程序员要失业?飞算 JavaAI 成救命稻草

飞算JavaAI开发助手

Cyber Triage 3.14 发布,带来全新用户界面、Hayabusa 集成、基线设定等功能

sysin

数字取证

「组装式开发」:App开发首选方式?

FinFish

APP开发 小程序容器 小程序技术 组装式开发

区块链交易所开发:开启数字交易新时代

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

跨链代币开发:架起区块链未来的桥梁

区块链软件开发推广运营

交易所开发 dapp开发 链游开发 公链开发 代币开发

探索虚拟线程:原理与实现

京东科技开发者

8 大最佳开源工具助力 Web 应用开发

NocoBase

GitHub 开源 开发者 开发工具 web 开发

卷哭同行!飞算 JavaAI 完整代码生成,让竞品只能望 “码” 兴叹

飞算JavaAI开发助手

Studio 3T 2025.8 发布 - MongoDB 的终极 GUI、IDE 和 客户端

sysin

mongodb

Excel百万数据高性能导出方案!

量贩潮汐·WholesaleTide

Excel

内网im软件,支持企业云盘的协同办公软件推荐

BeeWorks

即时通讯 IM 私有化部署

腾讯元宝再更新!上线“对话分组”,支持自定义回答风格

极客天地

人工智能与智能合约:如何用AI优化区块链技术中的合约执行?

天津汇柏科技有限公司

智能合约 人工智能

JEP 443:未命名模式和变量致力于提升Java代码的可读性_编程语言_A N M Bazlur Rahman_InfoQ精选文章