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句话,网友:是求救信号!JEP 481:作用域值API的第3个预览版随JDK 23发布,带来关键增强GPT 自动生成SQL语句“救世宰相”张居正最高级的5句名言,背下来逆天改命!《蛤蟆先生去看心理医生》最治愈的4句话,读懂你就通透了最能提供情绪价值的25句台词芝加哥女$10万积蓄被骗光!只因对方的几句话 她深信不疑……孩子最讨厌的3句话,很多父母天天说《人生的智慧》:令人醍醐灌顶的10句话,句句入骨,一生至少读一次这句有毒的“大道理”,很多人从小听到大2024年上半年,值得收藏的50句文案!东南亚的出海新红利,吴晓波、秦朔等嘉宾的50句精彩观点给出了哪些风向?助你走出「人生低谷」的10句话 | 社长日签《玫瑰的故事》大结局:亦舒最深刻的5句话,读懂就不再抱怨生活出海峰会第一天,施展、顾清扬、秦朔等10位嘉宾的50句精彩观点《庆余年2》最火的7句台词:人这辈子,最怕突然听懂一句话古人的7句老话,让人舒服,让人明白闺女哪里跌倒就想哪里躺平时,我用3句话让她满血复活20句高级的520表白文案!
logo
联系我们隐私协议©2024 bendi.news
Bendi新闻
Bendi.news刊载任何文章,不代表同意其说法或描述,仅为提供更多信息,也不构成任何建议。文章信息的合法性及真实性由其作者负责,与Bendi.news及其运营公司无关。欢迎投稿,如发现稿件侵权,或作者不愿在本网发表文章,请版权拥有者通知本网处理。