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,弯道超车的机会来了?

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

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