AICon上海|与字节、阿里、腾讯等企业共同探索Agent 时代的落地应用 了解详情
写点什么

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

评论

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

开源生态|超实用开源License基础知识扫盲帖(上)

Orillusion

开源 WebGL 元宇宙 Metaverse webgpu

50万条数据,解读四川两座城市数字经济发展底气(下)

易观分析

经济 四川经济

开放银行引入第三方生态,系统风控助力事前-中风险监控

Speedoooo

数字化 开放银行 异业合作

金融机构等入局数字藏品;证券期货类应用用户规模达1.34亿

易观分析

金融 证券

CountDownLatch

急需上岸的小谢

6月月更

【LeetCode】划分数组使最大差为 K Java题解

Albert

LeetCode 6月月更

重磅发布 | Serverless 应用中心:Serverless 应用全生命周期管理平台

Serverless Devs

【前端每日一学】vue框架的深入学习

恒山其若陋兮

6月月更

2022年SaaS行业十大趋势:SaaS的新机遇有哪些?

小炮

创新不止,英特尔强调HPC的开放性和可持续性

科技之家

flutter系列之:用来管理复杂状态的State详解

程序那些事

flutter 程序那些事 6月月更 widget

App中快速复用微信登录授权的一种方法

Speedoooo

APP开发 微信授权 微信登录

新一期HarmonyOS认证正式发布,速来围观!

HarmonyOS开发者

HarmonyOS

OpenHarmony 3.2 Beta1版本正式发布

OpenHarmony开发者

Open Harmony

PC端实现运营小程序,是否能再创PC时代又一春!

Geek_99967b

小程序 小程序转app

打金?工作室?账号被封?游戏灰黑产离我们有多近

行者AI

面向高校 | “云原生技术应用与实践”示范课程项目开放申报

Serverless Devs

如何使用阿里云 CDN 对部署在函数计算上的静态网站进行缓存

Serverless Devs

Serverless 前端 前端工具

AIOps落地五大原则(一):大势所趋

BizSeer必示科技

小程序IDE,大趋势下催生的效能提速工具

Speedoooo

ide 效率工具 编程效率 移动开发 APP开发

重磅!KubeEdge单集群突破10万边缘节点|云原生边缘计算峰会前瞻

华为云开发者联盟

云计算 云原生 华为云

社区活动 | Apache Doris 社区长期征文活动&演讲议题征集 正式开始啦!

SelectDB

开源社区 apache doris 征文投稿 议题征集 社区活动

孙勇男:实时视频 SDK 黑盒测试架构丨Dev for Dev 专栏

声网

自动化测试 Dev for Dev

「技术人生」第8篇:如何画业务大图

阿里巴巴中间件

阿里云 云原生 技术文章

微信团队分享:微信后台在海量并发请求下是如何做到不崩溃的

JackJiang

微服务 即时通讯 im开发 微信架构

使用APICloud开发app的动态权限及Android平台targetSdkVersion设置教程

YonBuilder低代码开发平台

android 权限管理 APICloud

Fomo3D模式dapp系统开发详解

开发微hkkf5566

三大特性,多个场景,Serverless 应用引擎 SAE 全面升级

Serverless Devs

阿里云 Serverless 微服务

同心助力,战役有AI

开源社

人工智能 疫情防控

优酷移动端弹幕穿人架构设计与工程实战总结

阿里巴巴文娱技术

技术 音视频 弹幕 视频 移动端

从“预见”到“遇见”SAE 引领应用步入 Serverless 全托管新时代

Serverless Devs

阿里云 Serverless

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