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

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

科技

作者 | A N M Bazlur Rahman
译者 | 明知山
策划 | 丁晓昀

在评审结束后,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/

声明:本文为 InfoQ 翻译,未经许可禁止转载。

今日好文推荐

挑战 Spark 和 Flink?大数据技术栈的突围和战争|盘点

谷歌放弃毛利率 99%业务:不想用我们的可以免费迁出!上云免费、下云无限“贵”的时代即将结束?

并发王座易主?Java 21 虚拟线程强势崛起,Go & Kotlin还稳得住吗 | 盘点

谷歌新年大裁员,引硅谷裁员潮!OpenAI正式推出GPT Store,但第一批应用已被像素级抄袭;腾讯服务器深夜崩溃 | Q资讯

微信扫码关注该文公众号作者

戳这里提交新闻线索和高质量文章给我们。
相关阅读
KFC Sliders折扣,仅需$2!!!Pepper Mayo, BBQ and Supercharged三种口味可选!Linux 黑话解释:Linux 中的 Super 键是什么? | Linux 中国给小个子的M M 推一件A R IT Z I A 羽绒服 Super snug puff[评测]ASUS Dual GeForce RTX 4070 Super 12GB GDDR6X 评测[评测]NVIDIA GeForce RTX 4080 Super Founders Edition 评测[评测]MSI GeForce RTX 4080 Super 16G Expert 评测没有弯弯绕绕,Supercell让UP主获得现金收入抽成、还越做越大了?[评测]NVIDIA GeForce RTX 4070 Super Founders Edition 评测最近几部剧的观感 - 好久不见年度十大流行语发布、印尼马拉皮火山喷发、韩国警告2050年经济将负增长等丨今日天下拿到Supercell投资,要做游戏业颠覆者,为何最终团队解散“一败涂地”?震惊!YouTube前执行长之子惨死大学宿舍内 死因竟是……赛事科普第1期 | Jessup模拟法庭近八年(2016-2023)赛题汇总重游商场赛事科普第3期 | Jessup模拟法庭近八年(2016-2024)赛题汇总美国顶尖大型机构Superday面试需要做哪些准备[评测]ASUS ROG Strix GeForce RTX 4070 Ti Super 16GB GDDR6X OC一药难求的减肥针,使用之前需要了解这些副作用;结合医生的指导事半功倍。如何对抗买量大佬,Supercell分享:我们要成为流行文化的一部分!红色日记 唐山地震 8.1-15Aritzia Super Puff Mid 什么颜色适合黄暖皮豪取5000万月下载量,Supercent发行总监:2024年如何做超休闲游戏?之前买洗地机的大家对不起!三位数的王者机型太值了!回国,也来聊聊手机【龙年卜卦】Neuralink, Superhuman or Super slaveSuper ball, 挺无聊这个季节就穿三合一冲锋衣!JEEP大品牌,可拆卸水貂绒内胆,防风雨,一件搞定四季![评测]ASUS ROG Strix GeForce RTX 4080 Super 16GB GDDR6X OC Edition传微软OpenAI领投人形机器人;OpenAI一键调用GPTs功能上线;年度大模型评测榜单公布丨AIGC大事日报[评测]Colorful iGame GeForce RTX 4080 Super Neptune OC 16GB 评测真没想到啊,2位数的价格,玩出来4位数的体验!Wetlands Project Suspended After NGO Lawsuit真·任意时刻视频插帧利器,更清晰,可编辑!已开源,可在线试用早报 | Gucci CEO称品牌将彻底翻开新的篇章;Superdry将破产重组;Chanel执行运营总监透露识别假冒手袋方法英伟达 RTX 4080 SUPER GPU 跑分出炉:OpenCL 测试比非 SUPER 版高 7%[电脑] 老夫聊发游戏狂-ASUS Dual GeForce RTX 4070 Super一件顶三件!秋冬刚需Jeep三合一冲锋衣,保暖防风防雨,可拆卸摇粒绒内胆,一件搞定四季!游泳赛Super Bowl观战指南及其讨论我宣布,VLOOKUP已经过时了!这个函数,才是最牛掰的!
logo
联系我们隐私协议©2024 redian.news
Redian新闻
Redian.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Redian.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。