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

news/2024/11/23 9:37:07/

摘要:

由于在 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 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 未来版本中一个很有前途的特性。


http://www.ppmy.cn/news/220794.html

相关文章

VUE 实现全屏指令方法

公司项目实现全屏功能&#xff0c;用到的地方很多&#xff0c;想到用vue指令实现 main.js import popupManager from element-ui/lib/lib/utils/popup/popup-manager Vue.prototype.gcommonPopupManager popupManager screenFull.js import Vue from vue const executor …

Centos7更换OpenSSL版本

OpenSSL 1.1.0 用户应升级至 1.1.0aOpenSSL 1.0.2 用户应升级至 1.0.2iOpenSSL 1.0.1 用户应升级至 1.0.1u 查看openssl版本 openssl version -v选择升级版本 我的版本是OpenSSL 1.0.2系列&#xff0c;所以要升级1.0.2i https://www.openssl.org/source/old/1.0.2/openssl-…

14.wxs

wxs&#xff08;WeiXin Script&#xff09;是小程序独有的一套脚本语言&#xff0c;可以理解为 微信的JS wxs与JS有区别&#xff0c;wxs有自己的数据类型&#xff0c;JS基本全是obj&#xff0c;wxs的数据类型有 number,string,boolean,object,function,array,date,regexp&…

安装linux系统遇到的问题

sata控制模式更改如上图 文件系统不在挂载点&#xff0c;在文件系统选 参考&#xff1a;https://zhuanlan.zhihu.com/p/148855857?from_voters_pagetrue

J1900 安装 OpenWrt 软路由到物理硬盘

1、准备一个U盘&#xff0c;把 "微PE" 刷到U盘中 2、把 "OpenWrt" 固件和写盘工具 "physdiskwrite" 放进U盘里 写盘工具&#xff1a;m0n0wall - physdiskwrite 3、开机启动&#xff0c;启动顺序调整为 "U盘" 启动 4、在PE环境下运行…

赛扬处理器_英特尔发布11代奔腾、赛扬处理器 均支持AVX指令集

9月3日凌晨&#xff0c;英特尔发布了9款11代酷睿处理器&#xff0c;英特尔还表示第11代的奔腾、赛扬、博锐平台以及DG1独立显卡将在晚些时候发布。 日前&#xff0c;英特尔终于低调上线了三款基于Tiger Lake的11代奔腾、赛扬处理器。这三款处理器分别是奔腾金牌7505、赛扬6305和…

此主机支持 Intel VT-x,但 Intel VT-x 处于禁用状态

此主机支持 Intel VT-x&#xff0c;但 Intel VT-x 处于禁用状态。如果已在 BIOS/固件设置中禁用 Intel VT-x&#xff0c;或主机自更改此设置后从未重新启动&#xff0c;则 Intel VT-x 可能被禁用…未能启动虚拟机。 Intel VT-x完整名称是Intel Virtualization Technology&#…

ESXi睿频检测

ESXi的VM中显示主机频率是恒定的&#xff0c;因此无法知道实际CPU是否睿频。通过查阅相关资料得出可以使用esxtop命令查看CPU实际频率。 以下是操作步骤 1.启动ESXi ssh服务。 2.使用ssh工具连接主机 3.执行esxtop 4.依次按p,f,f,回车 5.使用A/MPERF列数据*cpu基础频率得到的就…