写点什么

JEP 447 已发布,可在构造函数的 super() 调用之前执行语句

  • 2024-01-29
    北京
  • 本文字数:1528 字

    阅读完需:约 5 分钟

JEP 447 已发布,可在构造函数的 super()调用之前执行语句

在评审结束后,JEP 447(super() 前置语句 (预览)) 已在 JDK 22 中交付。该 JEP 来自 Project Amber 项目,提议允许在构造函数的 super() 调用之前出现不引用正在创建的实例的语句,并保留构造函数现有的安全性和初始化保证。Oracle 技术顾问成员 Gavin Bierman 为 Java 社区提供了这个 JEP 的初始规范,供社区评审并提供反馈意见。


传统上,要求 Java 构造函数将对另一个构造函数的显式调用作为第一条语句。这个约束确保了自上而下的执行顺序,并防止对未初始化字段的访问,极大地限制了构造函数逻辑的表达性和可读性。考虑下面的例子:


public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) { super(value); // Potentially unnecessary work if (value <= 0) throw new IllegalArgumentException("non-positive value"); }}
复制代码


通过在调用超类构造函数之前验证其参数来声明快速失败的构造函数会更好。JEP 447 放宽了这些限制,允许在显式构造函数调用之前出现不引用正在创建的实例的语句。有了这个功能,上面的代码可以简化为:


public class PositiveBigInteger extends BigInteger {
public PositiveBigInteger(long value) { if (value <= 0) throw new IllegalArgumentException("non-positive value"); super(value); }}
复制代码


考虑另一种情况,比如子类构造函数需要为超类构造函数准备参数。以前,由于超类构造函数调用必须作为第一条语句,这就需要使用辅助方法。


public class SubClass extends SuperClass {    public SubClass(Certificate certificate) {        super(prepareByteArray(certificate));    }
private static byte[] prepareByteArray(Certificate certificate) { // Logic to prepare byte array from certificate // ... return byteArray; }}
复制代码


在这个例子中,prepareByteArray 方法在将 Certificate 对象传递给 SuperClass 构造函数之前对它进行处理。有了 JEP 447,这个过程变得更加简洁和直观。


public class SubClass extends SuperClass {    public SubClass(Certificate certificate) {        // Directly include the logic to prepare byte array        PublicKey publicKey = certificate.getPublicKey();        if (publicKey == null) {            throw new IllegalArgumentException("Null certificate");        }        byte[] byteArray = switch (publicKey) {            case RSAPublicKey rsaKey -> rsaKey.getEncoded();            case DSAPublicKey dsaKey -> dsaKey.getEncoded();            default -> throw new UnsupportedOperationException("Unsupported key type");        };        super(byteArray);    }}
复制代码


在这个新的例子中,SubClass 的构造函数直接包含处理 Certificate 对象的逻辑。这种直接的方法增强了可读性,减少对使用辅助方法的需求,展示了 JEP 447 在实际应用场景中的好处。


JEP 447 不仅提供了更大的灵活性,还保留了构造函数行为的基本保证,确保子类构造函数不会干扰超类的实例化。这个更新不需要对 Java 虚拟机(JVM)做任何修改,仅依赖 JVM 现有的能力来验证和执行构造函数调用之前的代码。


随着 Java 的不断发展,JEP 447 清楚地表明了 Java 在不断适应现代编程实践。它反映了在引入新特性和保持 Java 生态系统健壮性之间的平衡。对于 Java 开发者来说,这意味着有机会探索更高效的编码实践,同时仍然保持对编程语言的核心原则。


原文链接

https://www.infoq.com/news/2024/01/java-constructors-enhancement/

2024-01-29 08:003710

评论

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

深入理解CSS Grid网页布局,并通过示例代码来演示如何使用它

兴科Sinco

前端 前端开发 网页布局 CSS Grid 网络相册

GridView(网格视图)的基本使用

芯动大师

ListView Android; girdview

IBM Semeru Windows 下的安装 JDK 17

HoneyMoose

阿里内网开源:多位大佬联合撰写的Java多线程手册被我拿到了

Java 多线程

燃!网易架构大牛熬夜手敲千页网络协议笔记,竟在GitHub标星数万

Java 计算机网络 网络协议

字节一面:“为什么网络要分层?每一层的职责、包含哪些协议?”

Java 计算机网络 网络协议

深度解析首个Layer3 链 Nautilus Chain,有何优势?

西柚子

解决mac电脑打开应用“意外退出”的问题 (点按“重新打开”以再次打开应用程序)

Rose

意外退出 Mac软件

苹果办公必备远程工具:Royal TSX使用教程

Rose

SSH Royal TSX 教程 Royal TSX 破解 Royal TSX mac下载

深度解析首个Layer3 链 Nautilus Chain,有何优势?

股市老人

云边端协同时序数据库的挑战与解决方案

CnosDB

时序数据库 开源社区 CnosDB 云边端协同

OpenAI-J 如何进行测试

HoneyMoose

应该升级 JDK 到 17 了吗

HoneyMoose

Amazon GuardDuty 的新增功能 – Amazon EBS 卷的恶意软件检测

亚马逊云科技 (Amazon Web Services)

Matlab常用图像处理命令108例(一)

timerring

图像处理 数字图像处理

全面项目管理软件:Project Office 激活版

真大的脸盆

项目管理 Mac Mac 软件 项目流程

在 Linux 上有哪些运行程序的方式?

蓬蒿

Shell fork Linux 上启动程序 execv

看完这一篇,ShardingSphere-jdbc 实战再也不怕了

勇哥java实战分享

从ChatGPT到AGI还有多远?| 社区征文

轻口味

ChatGPT

Okhttp 的 retrofit2 运行警告信息异常

HoneyMoose

厉害了!刷完这份 532 算法秘笈后,我成功斩获字节、快手offer

Java 数据结构 面试 算法

死磕Spark事件总线——聊聊Spark中事件监听是如何实现的

Java 大数据 spark 事件监听

清华AIR与英特尔开展合作,研发全新绿色数据中心解决方案

科技之家

普通大专生,从面试无人问到拿下阿里offer!说说我的艰辛历程

Java 面试 专科

热点面试题:Vue2、3 生命周期及作用?

Immerse

JavaScript 生命周期 Vue 3 vue2 前端面试题

面试官:如何防止 Java 源码被反编译?我:有点懵

Java Java源码

BetterSnapTool for Mac 帮你整理窗口,提升效率

Rose

BetterSnapTool 窗口管理软件 mac软件下载

表格检测识别技术的发展历程

合合技术团队

人工智能 算法 表格识别

图数据结构-路径查找

alexgaoyh

DFS 图数据库 知识图谱 路径规划 三元组

学会用规则引擎Drools,让你早点下班

JAVA旭阳

Java drools

JEP 447 已发布,可在构造函数的 super()调用之前执行语句_编程语言_A N M Bazlur Rahman_InfoQ精选文章