写点什么

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

评论

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

字节一二三面,面经(已经OC)四月底真实面试经历!

Java大蜗牛

Java 程序员 面试 算法 后端

从简历被拒到收割8个大厂offer,我用了3个月成功破茧成蝶

Java架构之路

Java 程序员 架构 面试 编程语言

打破思维定式(二)

Changing Lin

5月日更

不要轻言放弃,阿里P8架构师分享十年学习生涯

Java架构师迁哥

天时地利人和—一个传奇操作系统的诞生记

兆熊

unix 历史

新手学习微服务,得先看看这篇文章

Java架构师迁哥

网络攻防学习笔记 Day5

穿过生命散发芬芳

5月日更 网络攻防

模块三作业:消息队列详细设计文档

薛定谔的指南针

架构实战营

建筑行业全周期区块链产融平台

CECBC

建筑行业

太简单了!这套Java异常处理的总结,80%的人都没看过

牛哄哄的java大师

Java

4.2 Go语言从入门到精通:延迟函数 defer

xcbeyond

defer Go 语言 5月日更

去中心化、P2P、NAT浅析

IT酷盖

音视频 WebRTC 去中心化

SpringBoot-技术专题-教你使用Cache缓存组件

码界西柚

spring springboot cache 5月日更

封神总结!蚂蚁金服+滴滴+美团+拼多多+腾讯15万字Java面试题

Java架构之路

Java 程序员 架构 面试 编程语言

架构设计模块3 - 消息队列架构设计文档

Presley

架构实战营

Vue Router 10 条高级技巧

Thrash

技巧

架构实战营 模块二 作业

Pitt

架构实战营

自研消息队列架构设计文档

菠萝吹雪—Code

架构实战营

【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!

牧小农

JVM;

算法训练营 - 学习笔记 - 第五周

心在飞

入门到精通!阿里码农熬了2晚整理的Java工具,真香

飞飞JAva

Java java工具类

自研消息队列架构设计文档

贯通

#架构实战营

Golang实现文件复制的技巧

liuzhen007

Go 语言 5月日更

超级全面的测试用例设计,你确定不来看一看?

程序员阿沐

软件测试 测试用例 测试工程师

进击的速溶咖啡:当中国AI开始玩工业化

脑极体

区块链与物联网融合发展都会有哪些机遇与挑战

CECBC

区块链

出游时,请继续戴好口罩

石云升

新冠疫苗 5月日更

Java开发项目模板16步快速搭建,拒绝重复性工作!

北游学Java

Java 项目 模板

Dubbo 动态配置中心

青年IT男

dubbo

GitHub首次上线!华为顶级工程师手写的这份网络协议手册全面开源

Java架构之路

Java 程序员 面试 编程语言 计算机

数字资产的发行是全球都无法阻挡的大趋势!

CECBC

数字资产

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