飞天发布时刻:2024年 Forrester 公有云平台Wave™评估报告解读 了解详情
写点什么

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

评论

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

开源项目|Go 开发的一款分布式唯一 ID 生成系统

AlwaysBeta

golang 开源 Go 语言

Nocalhost 亮相 CD Foundation 国内首届 Meetup,Keith Chan 将出席致辞

CODING DevOps

Linux Nocalhost Meetup CDF

SAP x EMQ 碳中和方案亮相进博会,数据基础设施支撑低碳发展

EMQ映云科技

物联网 IoT mqtt 进博会 SAP

解决大数据分布式计算痛点:腾讯正式开源分布式远程Shuffle服务Firestorm

科技热闻

OceanBase 创始人阳振坤 | 十余年打磨 国产数据库之路砥砺前行

OceanBase 数据库

数据库 开发者 趋势 1024 CSDN

周傲英:替代工程只是契机,转型升级才是大势所驱

OceanBase 数据库

数据库 开源 数字化转型 云栖大会

京东三面(后端)凭借这份Java面试复盘手册,已斩获60K*15offer

Java spring 程序员 算法 JVM

新赛季集结!“百度AI创意派”正在寻找有创意的你

科技热闻

13万字!腾讯高工手写JDK源码笔记 带你飙向实战,linux高级教程

Java 程序员 后端

OceanBase 3.2 正式发布 | 更硬核的 HTAP,TPC-H 性能提升6倍!

OceanBase 数据库

数据库 分布式 云栖大会 核心系统 一体化架构

出自清华大牛之手的Redis源码核心手册,已被列为GitHub首推书籍

Java redis 编程 程序员

13 高可用的服务,字节跳动今日学习内容

Java 程序员 后端

12 高可用的应用,微众银行java面试

Java 程序员 后端

“你好,天津”网络短视频大赛月内启动

InfoQ 天津

OpenMLDB v0.3.0 正式发布,支持快速部署使用的单机模式

第四范式开发者社区

开源 第四范式 OpenMLDB

git submodule 添加/删除

webrtc developer

互联网+质量基础设施服务平台,NQI一站式服务平台搭建

电微13828808271

如果明天交任务,自己做今晚能完成,而让下属做需要一周时间,怎么办?

石云升

职场经验 11月日更

加速拥抱支持开源生态 | OceanBase 开源版3.1.1正式发布

OceanBase 数据库

数据库 开源 开发者 成绩单 DTCC

杨冰:OceanBase助力数字化转型,原生分布式数据库成核心系统首选

OceanBase 数据库

数据库 开源 分布式 云栖大会 核心系统

腾讯架构师推荐架构电子书:多线程+JVM+Nginx+Redis+SpringBoot

nginx redis 程序员 Spring Boot JVM

去年今日我凭借这份文档,摇身一变成了被BAT大牛们看中的幸运儿

Java spring 程序员 JVM Kakfa

共筑数据库未来 | 2021 OceanBase 原生分布式数据库论坛回顾

OceanBase 数据库

开源 分布式 #数据库 云栖大会 圆桌论坛

长隆熊猫酒店联合番禺消防大队开展“我是小小消防员”活动

江湖老铁

融合通信技术趋势和演进方向

网易云信

云通信 通信云 传输协议

浪潮云说丨GPU云服务器,助力AI计划轻松实现

云计算

Python代码阅读(第55篇):获取字典的所有键或所有值的列表

Felix

Python 编程 阅读代码 字典 Python初学者

CVE-2017-10271漏洞复现与分析

喀拉峻

网络安全 信息安全 渗透测试

个人项目管理软件解决方案

低代码小观

项目管理 管理系统 企业管理系统 项目管理工具 企业管理工具

腾讯大数据全场景在离线混部系统Caelus正式开源

科技热闻

杨传辉:深挖 OceanBase 背后的技术逻辑,助力数据库核心系统升级

OceanBase 数据库

数据库 开源 分布式 数字化转型 核心系统

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