2025上半年,最新 AI实践都在这!20+ 应用案例,任听一场议题就值回票价 了解详情
写点什么

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

评论

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

创新引领!矩阵起源荣获中国信通院双重认可!

MatrixOrigin

数据库 分布式 云原生 超融合 矩阵起源

码中寻趣:低码专家与开发者的「神秘会议」 ——华为云Astro扫地僧出山

华为云PaaS服务小智

云计算 低代码 华为云 华为开发者大会2023 Astro

方言语音识别数据驱动人工智能的多元文化发展

数据堂

方言语音

用友BIP全球司库“五大管家”,助力大型企业一流司库建设

用友BIP

全球司库

为什么选择美国虚拟主机是你的明智之选?

一只扑棱蛾子

美国虚拟主机

从零开始构建一个电影知识图谱,实现KBQA智能问答[下篇]:Apache jena SPARQL endpoint及推理、KBQA问答Demo超详细教学

汀丶人工智能

人工智能 自然语言处理 知识图谱 智能问答 KBQA

GPT-4被破解!数智时代大突破!低代码开发平台揭秘:AI模型架构演进的利器

不在线第一只蜗牛

人工智能 低代码 模型调参 ChatGPT GPT-4

【HDC.Cloud 2023】华为云区块链分论坛内容值得再读!

华为云开发者联盟

区块链 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

Cloud Kernel SIG月度动态:ANCK 5.10-016将落地kABI机制,5.10-015版本规划发布

OpenAnolis小助手

操作系统 内核 anck 龙蜥sig 版本规划

科兴未来|“追光逐电 才聚紫琅”光电产业创新创业大赛

科兴未来News

沉潜蓄势,厚积薄发:StoneDB-5.7-V1.0.4版本正式发布!特性增强,稳定性大幅提升

StoneDB

数据库 版本发布 StoneDB

火热的低代码和无代码赛道

互联网工科生

软件开发 低代码 无代码 应用开发

实例分享| anyRTC 部署安徽某市应急实战指挥平台

anyRTC开发者

音视频 快对讲 融合会议 视频监控 综合调度

人工智能的底层逻辑

博文视点Broadview

软件测试/测试开发丨Selenium环境安装配置

测试人

Python 程序员 软件测试 selenium chromedriver

从零开始构建一个电影知识图谱,实现KBQA智能问答[上篇]:本体建模、RDF、D2RQ、SPARQL endpoint与两种交互方式详细教学

汀丶人工智能

人工智能 自然语言处理 nlp 知识图谱 本体建模

MatrixOne悲观事务实现

MatrixOrigin

数据库 分布式 云原生 矩阵起源

重塑未来的1课:组装式交付新引擎——华为云智能化低代码平台

华为云PaaS服务小智

云计算 低代码 华为云 华为开发者大会

大学生活动社交小程序开发笔记(1)

CC同学

低代码技术分享官丨inBuilder使用有向无环图助力元数据工程依赖管理

inBuilder低代码平台

北京汽车牵手火山引擎数智平台,探寻车企数字化升级新通路

字节跳动数据平台

数字化 数字化升级 车企 企业号 7 月 PK 榜

2023年最具威胁的25种安全漏洞(CWE TOP 25)

华为云开发者联盟

安全 华为云 安全漏洞 华为云开发者联盟 企业号 7 月 PK 榜

软件定义汽车场景中的数据流处理

EMQ映云科技

车联网 mqtt 数据流

三问三答:细数GaussDB迁移的核心技术

华为云开发者联盟

数据库 后端 华为云 华为云开发者联盟 企业号 7 月 PK 榜

直播预告 | 博睿学院:海量数据实时可信认证

博睿数据

智能运维 博睿数据 数据要素 博睿学院

如果AI能帮我 | 社区征文

六月的雨在InfoQ

AIGC ChatGPT 年中技术盘点 通义听悟

超级应用App的概念及构建思路

Onegun

小程序 小程序容器 超级应用

分布式系统常见问题

互联网工科生

分布式

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