写点什么

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

  • 2023-05-31
    北京
  • 本文字数:1777 字

    阅读完需:约 6 分钟

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

摘要:

由于在 JEP 432 和 JEP 405 中进行了反馈驱动的增强,JEP 440,最终确定的记录模式(Record Patterns)已从 JDK 21 从 Proposed to Target 状态提升为 Target 状态。在与类型模式一起使用时,记录模式现在允许进行强大的数据导航和处理。JEP 432 的主要更改是删除了增强 for 语句头中的记录模式。


JDK 21 的 JEP 440,记录模式已从 Proposed to Target 状态提升Targeted 状态。该 JEP 最终确定了这个特性,并结合了增强功能以响应前两轮预览的反馈:JEP 432,记录模式(第二次预览),在 JDK 20 中交付;以及 JEP 405,记录模式(预览),在 JDK 19 中提供。该特性通过记录模式增强了语言以解构记录值。记录模式可以与类型模式结合使用,以“实现一种强大的、声明式的和可组合的数据导航和处理形式”。类型模式最近进行了扩展以用于 switch case 标签:JEP 420,switch模式匹配(第二次预览),在 JDK 18 中提供,以及 JEP 406,switch模式匹配(预览),在 JDK 17 中提供。与 JEP 432 相比,其最重要的更改是删除了对出现在增强for语句头中记录模式的支持。


通过所有这些更改,Java 现在通过引入可嵌套的记录模式,正朝着更具声明式、以数据为中心的编程风格发展。这一演变是在模式匹配与 Java 16 引入的JEP 394instanceof操作符集成之后发生的。

考虑这样一种情况,即你有一个记录Point和一个枚举Color

record Point(int x, int y) {}enum Color { RED, GREEN, BLUE }
复制代码

无论对象是否是record的实例,新的记录模式都允许对其进行测试,并直接解构其组件。例如:

if (r instanceof Rectangle(ColoredPoint ul, ColoredPoint lr)) {    System.out.println(ul.c());}
复制代码

更强大的是它提供了嵌套模式,允许进一步解构record值。考虑如下的声明:

record ColoredPoint(Point p, Color c) {}record Rectangle(ColoredPoint upperLeft, ColoredPoint lowerRight) {}
复制代码

如果我们想从左上角提取颜色,可以这样写:

if (r instanceof Rectangle(ColoredPoint(Point p, Color c), ColoredPoint lr)) {    System.out.println(c);}
复制代码

记录模式的这种演变扩展了模式匹配,以解构记录类的实例,从而支持了更复杂的数据查询。无论对象是否是record的实例,它都允许对其进行测试,并直接提取对象的组件。这种方法使代码更加简洁,而且不易出错。考虑如下的示例:

static void printXCoordOfUpperLeftPointWithPatterns(Rectangle r) {    if (r instanceof Rectangle(ColoredPoint(Point(var x, var y), var c),                               var lr)) {        System.out.println("Upper-left corner: " + x);    }}
复制代码

此外,嵌套模式的引入通过提供解构嵌套数据结构的能力,进一步实现了这一点。它们使开发人员能够集中处理错误,因为整个模式只有匹配和不匹配两类。这样就不需要检查和处理每个单独的子模式匹配故障了。

这些嵌套模式也可以很好地与JEP 441引入的switch表达式配合使用。switch表达式的模式匹配增强了switch语句,允许在case标签中使用模式。这使得代码更具表现力,并减少了由于switch语句中的遗漏 case 而导致缺陷的可能性。

例如,考虑以下的声明:

class A {}class B extends A {}sealed interface I permits C, D {}final class C implements I {}final class D implements I {}record Pair<T>(T x, T y) {}
Pair<I> p;
复制代码

使用记录模式和枚举switch,我们可以执行以下操作:

switch (p) {    case Pair<I>(C c, I i) -> ...    case Pair<I>(D d, C c) -> ...    case Pair<I>(D d1, D d2) -> ...}
复制代码

然而,这些更新带来了一些风险和假设。与任何语言的更改一样,其存在影响现有代码库的风险。此外,这些更改假设开发人员熟悉记录类和模式匹配,而这两个特性对 Java 来说相对还较新。


展望未来,有许多方向可以扩展记录模式。其中包括可变变量记录的 varargs 模式、匹配任何值但不声明模式变量的未命名模式,以及可以应用于任意类而不仅仅是记录类的值模式。


总而言之,在 Java 中引入记录和嵌套模式是该语言的一次重大飞跃。它允许更具声明式的编码风格,从而产生更干净、更易于理解的代码。虽然存在一些风险,但潜在的好处能使它成为 Java 未来版本中一个很有前途的特性。


原文链接:

https://www.infoq.com/news/2023/05/java-gets-boost-with-record/


延伸阅读:

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

加入有序集合,Java 集合框架变得更加完善

2023-05-31 18:3712143

评论

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

云桌面年终狂欢,多重福利等你来拿!

Finovy Cloud

云主机 云服务器 云桌面 云电脑

知乎启用AutoMQ替换Kafka,开辟成本优化与运维提效新纪元

AutoMQ

Java 数据库 kafka 客户案例

工业公辅车间数智化节能头部企业,蘑菇物联选择 TDengine 升级 AI 云智控

TDengine

数据库 tdengine 时序数据库

YashanDB在地理信息系统(GIS)领域的关键功能和技术优势

YashanDB

yashandb 崖山数据库 地理信息系统

一行代码都不改,Golang 应用链路指标日志全知道!

阿里巴巴云原生

阿里云 云原生

探索1688阿里巴巴API接口:揭秘商品详情与关键字搜索的奥秘

代码忍者

API 接口 pinduoduo API

苹果m1能玩steam吗,苹果笔记本玩steam游戏教程

阿拉灯神丁

游戏 MacBook steam M1芯片 CrossOver Mac下载

客户案例|大模型加持智能会议,金融机构实现“写纪要”到“审纪要”的飞跃

澜舟孟子开源社区

人工智能 大模型 智能办公

翻倍只是山寨币季的点火阶段:市场分歧与未来趋势

区块链软件开发推广运营

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

汽车摆臂行业生产设备数据采集及集成

万界星空科技

mes #汽车 设备数据采集 汽车摆臂行业 汽车摆臂mes

AI智能体的开发流程

北京木奇移动技术有限公司

AI应用 AI智能体

定制化NFT链游DAPP开发:一站式解决方案助力游戏创新

区块链软件开发推广运营

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

改变仿真游戏规则,Altair的AI与HPC技术创新仿真之路

Altair RapidMiner

数据分析 仿真 CAE #人工智能 altair

企业如何挑选OKR目标管理软件?9款工具功能全面分析

易成研发中心

探索1688阿里巴巴API接口:图片搜索商品列表(拍立淘)与店铺所有商品列表的实战应用

代码忍者

API 接口 pinduoduo API

Supersonic 平台上线Top Creatives Library 功能,为手游开发者打造广告投放素材库

极客天地

YashanDB 开机自启

YashanDB

数据库 yashandb 崖山数据库 开机自启

云数仓ByteHouse的湖仓一体设计与实践

字节跳动数据平台

大数据 数据仓库 湖仓一体

从仪表盘探索 MongoDB 关键指标

巴辉特

盘点本轮牛市币价再创新高的「老山寨」

TechubNews

Spring AI Alibaba 配置管理,用 Nacos 就够了

阿里巴巴云原生

阿里云 云原生

数据同步、流计算全面强化,TDengine 3.3.4.3 版本正式发布

TDengine

数据库 tdengine 时序数据库

在“黑天鹅”时代,如何锻造创业者的认知韧性?| 陶建辉演讲分享

TDengine

数据库 tdengine 时序数据库

TikTok账号封号原因有哪些?

Ogcloud

TikTok tiktok运营 TikTok养号 tiktok封号

判断TikTok节点IP的纯净度高不高的几个方法

Ogcloud

tiktok运营 tiktok节点 tiktok网络 tiktok封号 tiktok代理节点

从开发者工具转型 AI 呼叫中心,这家 Voice Agent 公司已服务 100+客户

声网

人事人才信息管理系统:2024年10大推荐系统

易成研发中心

Record模式提升了Java,能实现更具表现力的编码_语言 & 开发_A N M Bazlur Rahman_InfoQ精选文章