QCon北京「鸿蒙专场」火热来袭!即刻报名,与创新同行~ 了解详情
写点什么

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

评论

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

Springboot3 + SpringSecurity + JWT + OpenApi3 实现认证授权

京茶吉鹿

spring security springboot OpenAPI JWT

软件测试/测试开发丨Pytest测试框架学习笔记分享

测试人

程序员 软件测试 自动化测试 数据驱动 pytest

华为云FunctionGraph函数工作流—— “Serverless“遇见”AI,释放AI生产力

华为云PaaS服务小智

Serverless 华为云 A2M

云图说|ModelArts开发环境,让AI开发、探索、教学更简单

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

Ascend C sqrt算子实战

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

AI 协助办公 |记一次用 GPT-4 写一个消息同步 App

NebulaGraph

GPT

人脸面部表情识别技术的挑战和未来发展

数据堂

人才是企业决胜的关键,企业进行全球布局时,如何解决人才供应问题?

用友BIP

人力资源 数智人力

[ABAQUS有限元分析]挤扩支盘桩支护基坑优化设计方法

思茂信息

abaqus abaqus软件 abaqus有限元仿真

数智时代的客服中心变革:从成本到价值

创智荟

数字化 大模型 客服 生产运营

DataLeap的全链路智能监控报警实践(一):常见问题

字节跳动数据平台

数据挖掘 数据分析 DataLeap 数据运维

腾讯董志强出席全国信安标委“标准周”:数字化转型需要高安全等级架构

腾讯安全云鼎实验室

云安全 企业安全 安全标准

本机部署langchain+chatGLM本地知识库

IT蜗壳-Tango

6 月 优质更文活动

2023开放原子全球开源峰会“开发者之夜”高能剧透!

开放原子开源基金会

开源 开放原子全球开源峰会 开发者之夜

从飞书妙记秒开率提升,看火山引擎A/B测试在研发场景的应用

字节跳动数据平台

AB testing实战 A/B 测试

昇腾实战丨DVPP媒体数据处理图片解码问题案例

华为云开发者联盟

人工智能 华为云 华为云开发者联盟 企业号 6 月 PK 榜

汇众智,奔涌向前赢未来 | 2023开放原子全球开源峰会 OpenAtom openEuler 分论坛即将启幕

开放原子开源基金会

开源 openEuler 开放原子全球开源峰会 开放原子

【网易云信】如何定位分析视频异常画面

网易云信

音视频技术 视频异常

中企出海,海外税务管理体系怎么设计?

用友BIP

中企出海

API全场景零码测试机器人,华为云发布ATGen in CodeArts TestPlan

华为云开发者联盟

云计算 华为云 华为云开发者联盟 企业号 6 月 PK 榜

用友荣获“2023年度上市公司数字化转型优秀案例”

用友BIP

软件测试/测试开发丨iOS App自动化测试

测试人

ios xcode 程序员 软件测试

为什么说财务共享中心是财务转型的支撑

用友BIP

财务共享

一分钟学会C4D与Blender做缝线的方法

Finovy Cloud

blender C4D

window.performance(前端性能监控并进行上报)

不叫猫先生

Performance 6 月 优质更文活动

英特尔PowerVia技术率先实现芯片背面供电,突破互连瓶颈

E科讯

快手 Flink 的稳定性和功能性扩展

Apache Flink

大数据 flink 实时计算

卡奥斯开源社区六月创作之星挑战赛开始啦!

Openlab_cosmoplat

人工智能 编程 活动 开源社区

企业数智底座白皮书:详解数智平台必备的六大能力

用友BIP

白皮书 数智平台 数智化转型白皮书 数智平台白皮书

【网易云信】如何定位分析视频异常画面

网易智企

音视频技术 视频异常

活动预告 | 中国数据库联盟(ACDU)中国行定档深圳,一起揭秘数据库前沿技术

墨天轮

MySQL 数据库 oracle postgresql opengauss

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