开工福利|免费学 2200+ 精品线上课,企业成员人人可得! 了解详情
写点什么

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:003582

评论

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

App Cleaner & Uninstaller Pro for Mac(苹果应用程序清理卸载工具) v8.2.5中文激活版

iMac小白

优秀的数据库编辑工具:TablePlus for Mac

Rose

MySQL 数据库 Mac软件 TablePlus激活版

Cookie复用大揭秘:助你在数据处理中事半功倍!

测吧(北京)科技有限公司

测试

免费好用的苹果mac必备软件:Mos for Mac(鼠标增强工具)

Rose

苹果软件 鼠标增强 Mos for Mac 免费软件下载

测试外包服务 | 从人员外包到测试工具、测试平台,提供全方位的测试解决方案~

测吧(北京)科技有限公司

测试

Magnet for mac(窗口辅助管理工具) 2.14.0中文免激活版

iMac小白

Visio Viewer for Mac(Visio文件编辑查看工具) v3.1.0激活版

iMac小白

测试外包服务 | 人员外包、测试工具、测试平台,全面测试解决方案

测试人

软件测试

mac创意图片编辑器:Luminar Neo破解版下载

Rose

从静态到动态化,Python数据可视化中的Matplotlib和Seaborn

华为云开发者联盟

Python 开发 数据可视化 华为云 华为云开发者联盟

WiFi7 IIOT Solution|IPQ9574 with QCN9274 Supports Up to 9 Radios Simultaneously What does it brings?

wallyslilly

WIFI7,

datagrip永久激活破解2023 附datagrip中文安装教程

Rose

ide 编程 datagrip

开班通知 | 全栈开发与自动化测试高薪私教班,手把手带你拿到高薪Offer

测吧(北京)科技有限公司

测试

Emby for Mac(多媒体影音库) 1.9.9中文版

iMac小白

【论文速读】| 视觉对抗样本:突破对齐的大语言模型

云起无垠

Transmit 5 for Mac(FTP客户端) 5.10.4中文版

iMac小白

DBeaverUE24好用的苹果电脑数据库(DBeaver Ultimate最新破解 )

Rose

数据库 Mac软件 DBeaver Ultimate

容器镜像加速指南:探索 Kubernetes 缓存最佳实践

SEAL安全

云计算 Kubernetes 容器

RapidClick for Mac(鼠标自动点击工具) v1.5.1激活版

iMac小白

自定义限速功能实践——Caffeine

FunTester

Illustrator 2024 for mac(标准矢量插画设计软件) v28.1中文激活版

iMac小白

面向中文大模型价值观的评估与对齐研究:“给AI的100瓶毒药”并解毒,守护AI纯净之心

汀丶人工智能

人工智能 大模型 大模型价值

工具分享丨分析GreatSQL Binglog神器

GreatSQL

macOS 14 Sonoma(苹果电脑mac系统) pkg完整安装包14.4正式版

Rose

苹果系统 macOS 14 Sonoma

5G双域专网+零信任的神奇魔法

权说安全

5G 零信任

Radio Silence for mac(简单好用的防火墙) v3.2激活版

iMac小白

Cookie复用的妙用:数据处理中的高效利器!

霍格沃兹测试开发学社

DaVinci Resolve (达芬奇后期调色)中文破解 一键安装 永久使用

Rose

达芬奇 视频后期特效处理 DaVinci Resolve 破解

用了两周开源堡垒机OneTerm,我有一些建议

37丫37

Premiere Pro 2024 for mac(pr2024 视频编辑器) v24.1中文激活版

iMac小白

Axure RP 9 for mac交互原型设计工具 最新激活版 支持M

iMac小白

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