亮网络解锁器,解锁网络数据的无限可能 了解详情
写点什么

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

评论

发布
暂无评论

RabbitMQ 的五种消息模型

Ayue、

RabbitMQ 3月月更

更新丨织信Informat V1.12:审批流通知支持移动端打开链接,一键实现快速审批

优秀

低代码开发

模块九:毕业设计

黄秀明

「架构实战营」

自己动手写Docker系列 -- 4.2使用AUFS包装busybox

Docker

自己动手写Docker系列 -- 4.3实现volume数据卷

Docker

Redis缓存应用—旁路缓存和数据一致性

javaadu

redis 缓存

B端/C端中,产品or运营哪个更重要?

源字节1号

运营

架构实战营毕业总结

novoer

「架构实战营」

架构学习总结

tony

「架构实战营」

掌握《网络》,见微才能知著

蔡农曰

TCP https 网络 HTTP TCP/IP

《不敢止步》--读书笔记

stars

2万字详解测试金字塔

俞凡

最佳实践 测试 研发效能

从简单代码入手,分析线程池原理

架构 线程池 池化思想

区块链技术如何赋能公共资源招采管理服务?

CECBC

常见的社群玩法盘点,你做的是哪一种?

源字节1号

开源 社群

模块九秒杀作业

novoer

「架构实战营」

架构师实战营王者荣耀商城异地多活架构设计

刘洋

#架构实战营 「架构实战营」

一个LabVIEW控件,生成模拟波形效果

不脱发的程序猿

数据可视化 LabVIEW 生成模拟波形效果

聊一聊C语言位域/位段

不脱发的程序猿

C语言 嵌入式开发 位域/位段

ICT的圣杯(三):产业融合的技术乐章

脑极体

模块5作业-”微博评论“的高性能高可用计算架构

卡西毛豆静爸

「架构实战营」

LabVIEW实现CRC校验

不脱发的程序猿

LabVIEW CRC校验

自己动手写Docker系列 -- 4.1使用busybox创建容器

Docker

QT读取剪切板内容-实现复制粘贴文本和图片

DS小龙哥

3月月更

当在线纠纷解决遇到区块链:去中心化司法的诞生

CECBC

自己动手写Docker系列 -- 4.4实现简单镜像打包

Docker

优秀程序员的30种思维--技术执念篇(22/100)

hackstoic

技术思维

元宇宙时代的5大风险

CECBC

电路模型和电路定律(Ⅰ)

謓泽

3月月更

一个用于学习KVM的迷你虚拟机

ScratchLab

虚拟机 虚拟化 kvm VT-x

云上业务配置选型的一些小Tips

穿过生命散发芬芳

3月月更

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