Bendi新闻
>
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资讯

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

来源:InfoQ

相关新闻

golang中一种不常见的switch语句写法短视频界的变革者:上海 AI lab 发布 Vlogger,几句话生成分钟级视频和老外交流一定会用得上的40个英语句子,背完棒棒哒!写作万年5.5!你还在用这些被考官拉黑的“万能句型”?妈妈用这6句“彩虹屁”,成功夸出了儿子的内驱力,上初中后再没操过心……亚裔妹纸的戴森吹风机坏了,却意外发现内部用笔写着1句话,网友:是求救信号!GPT 自动生成SQL语句助你走出「人生低谷」的10句话 | 社长日签《玫瑰的故事》大结局:亦舒最深刻的5句话,读懂就不再抱怨生活出海峰会第一天,施展、顾清扬、秦朔等10位嘉宾的50句精彩观点《庆余年2》最火的7句台词:人这辈子,最怕突然听懂一句话古人的7句老话,让人舒服,让人明白闺女哪里跌倒就想哪里躺平时,我用3句话让她满血复活20句高级的520表白文案!和喜欢的人聊天,吴晓波的22句真心话“中方决定不同意”,仅这句话的意思就很有意义停止一切人际内耗的1句话“宇宙第一中学”人大附中的优秀毕业生为何纷纷走向平庸?芒格的这句话揭开了真相…...母亲节:送给妈妈的100句祝福创办频道十年风雨中,吴晓波的27句经典语录外国人常用的60句英语口语, 99%的人都说错了!“宇宙第一中学”人大附中的优秀毕业生为何纷纷走向平庸?芒格的这句话点醒了中国家长“宇宙第一中学”人大附中的优秀毕业生为何纷纷走向平庸?芒格的这句话点醒了中国家长……常说这3句话的夫妻迟早会离婚,不信你看!
logo
联系我们隐私协议©2024 bendi.news
Bendi新闻
Bendi.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Bendi.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。