写点什么

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

评论

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

网易云音乐音视频算法的 Serverless 探索之路

阿里巴巴云原生

阿里云 Serverless 云原生 实践案例 合作伙伴

2021最新支付宝4面+美团4面+拼多多四面面试总结,狂刷200道数据结构与算法

Java 程序员 后端

OpenYurt 与 FabEdge 集成验证——云边数据面通信初试

阿里巴巴云原生

阿里云 云原生 边缘计算 openyurt FabEdge

双维度第一!百度智能云领衔中国“AI+工业互联网”市场领导者阵营

百度大脑

人工智能 百度

谈一谈区块链项目使用的数据库LevelDB

Regan Yue

区块链 leveldb 11月日更

30天熬夜苦学这本Java后端架构设计精讲,大厂三面架构问题so easy

Java 程序员 后端

5年Java经验字节社招:半月3次面试,成功拿到Offer,大厂Mysql高频面试题

Java 程序员 后端

6种新方法帮你提高Java学习能力,mysql教程入门到精通pdf

Java 程序员 后端

2021年高频Java面试题集锦(含答案),华为java面试视频直播

Java 程序员 后端

网络安全:一次艰难的WAF绕过

网络安全学海

网络安全 信息安全 渗透测试 WEB安全 安全漏洞

2021最新整理美团面经分享:999页Java面试宝典+技术知识点总结(1)

Java 程序员 后端

2021版最新!字节跳动3面+腾讯6面一次过,java高级特性面试题

Java 程序员 后端

2021毕业的Java应届生,面试需要掌握哪些技能,才能收割offer

Java 程序员 后端

2021版阿里Java亿级并发设计手册:基础+数据库,linux服务器开发需要的技术

Java 程序员 后端

2021秋招必刷题:Redis+Mybatis,java使用教程答案

Java 程序员 后端

2021阿里大牛最新发布:Java高频面试题和核心技术(已涨薪6K

Java 程序员 后端

2021技能大赛云计算赛项先电2,java基础入门课后答案清华大学出版社

Java 程序员 后端

2021最新整理美团面经分享:999页Java面试宝典+技术知识点总结

Java 程序员 后端

linux之git入门命令

入门小站

Linux

97 道大厂 Java 核心面试题出炉,来试试看你会几道题?

Java 程序员 后端

如何将字符串截取成一个集合

卢卡多多

内容合集 11月日更

09 K8S之对象类资源配置

穿过生命散发芬芳

k8s 11月日更

50道Java面试常问的基础知识,虽是基础但是避坑之路可得小心谨慎

Java 程序员 后端

95 后程序员一出校门就拿年薪 32 万?,java入门视频教学

Java 程序员 后端

2021春招总结,面了阿里,腾讯,做Java程序员真的没有春天吗

Java 程序员 后端

Flink企业级优化全面总结(3万字长文,15张图)

大数据老哥

阿里P6面试官:Redis如何实现分布式锁?锁过期了怎么办?

Java高级开发

redis Java、

30岁,转行学编程靠谱吗?,java银行面试的问题

Java 程序员 后端

3分钟快速搞懂Java的桥接方法,Java多态实现原理解析

Java 程序员 后端

7张图带你轻松理解Java 线程安全,java开发架构思想

Java 程序员 后端

最佳实践|Apache Pulsar 在拉卡拉的技术实践

Apache Pulsar

开源 架构 中间件 Apache Pulsar 消息系统 Apache 分布式

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