Redian新闻
>
Java 升级 Record 类型:编码更富表现力

Java 升级 Record 类型:编码更富表现力

公众号新闻

作者 | A N M Bazlur Rahman
译者 | 刘雅梦
策划 | 丁晓昀

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 394,instanceof 操作符集成之后发生的。

考虑这样一种情况,即你有一个记录 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/

声明:本文为 InfoQ 翻译,未经许可禁止转载。

今日好文推荐

免费版“Github Copilot”,编程能力还翻倍?!谷歌硬刚微软,推出全新Colab编程平台

百度回应 Bing 成中国桌面搜索第一;阿里回应大裁员传闻;文心一言市场负责人怒怼科大讯飞|Q资讯

中国的“贝尔实验室”:我们的数据库从内核的第一行代码写起

微软Copilot“杀疯了”:Windows引入AI助手、Bing接入ChatGPT,弯道超车的机会来了?

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
求助:房子 价钱是按public record 面积算,还是按listed面积算呢?亚裔右转是自由派司法改革的错?Global luxury goods market accelerated after record 2022二代青少年活动|征稿通知【报名群二维码更新、艺术周网站推出,活动倒计时20天】经常权变跟进昨天的Criminal Record on Credit Report加州 7 个邮政编码跻身美国最昂贵的 10 个邮政编码之列游戏逼真如现实世界,Unrecord狂揽60万玩家预约,毛骨悚然引争议Logitech G G512 CARBON LIGHTSYNC RGB Mechanical Gaming Keyboard 针锋相对!为挑战 GPT-4 加持的 Copilot X,谷歌与拒绝被微软收购的 Replit 联合发布编码工具AI自动编码将上线!谷歌Colab硬刚Github Copilot,编程效率要翻天应该说more eco-friendly还是eco-friendlier?迷人的反派:编剧的经典人物塑造法Amid Recovery Push, Street Vendors Make a Comeback Across China2022南美南极行(28)南极之旅(2022年11月23日-12月2日)【解字】“从”,“比”,“并”——夫妻之道,为友之道As Travel Resumes, WeChat, Alipay to Support Foreign Bank Cards画面太拟真被指诈骗?战术射击FPS《Unrecord》疑似采用这项新技术Rust 基础系列 #8:编写里程碑 Rust 程序 | Linux 中国读书没用了吗!最新研究发现,技工比大学毕业生更快乐、更富有!比Python快35000倍!LLVM&Swift之父宣布全新编程语言Mojo:编程被颠覆了Bordering on Recovery: Life on China’s Russian Frontier傅雷次子傅敏去世:编辑《傅雷家书》的人走了《心中最美的歌》&《山水相恋》bié Records 特殊发行 • 网店活动 • 国际唱片店日2023趣图:编程中的最难部分居然是它?编码器-解码器 | 基于 Transformers 的编码器-解码器模型校友展|征稿通知【报名群二维码更新、艺术周网站推出,活动倒计时20天】儿童“注意力不集中”必须要纠正?不!这其实是他们编码更广泛信息的独有优势美国为何变得比其他西方国家更富有?综艺后期狂喜:编辑一帧,整个视频跟着变!比LNA渲染快5倍,Adobe联合出品重构传统企业工作场景 百度如流升级推出超级助手、智能编码等功能暑期特训班:编剧如何活下来?深度:美国更富,欧洲更穷。英格兰银行专家:咱们认命吧!苹果iOS 17细节升级:72小时内可撤销iPhone密码更改急需有声配音员:400元/天,对照小说文本播讲即可,工作地点不限,时间自由!送4天免费培训!免费声音表现力测试!Charging Your Electric Car is Becoming More Expensive in China
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。