写点什么

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

评论

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

低代码这么火,为什么搞砸的这么多?

秃头小帅oi

MacX Video Converter Pro视频处理软件

Geek贝

Iridient Developer for mac RAW 图像处理与转换软件

Geek贝

Mac 软件

基于YashanDB数据库的分布式系统构建经验

数据库砖家

利用YashanDB数据库实现高并发访问的方案

数据库砖家

从被动救火到主动预测!碧桂园服务以图谱技术重塑IT运维底座

智在碧得

PDF Protector for Mac(PDF加密与解密工具)

Geek贝

数据驱动决策:WeOps如何提升大型K8s集群排障效率

嘉为蓝鲸

监控 智能运维 k8s集群 #WeOps

利用YashanDB数据库提升电信行业数据服务质量

数据库砖家

Archicad 28 for Mac(3D建筑建模工具)

Geek贝

商品中心—库存分桶高并发的优化文档(二)

量贩潮汐·WholesaleTide

Java JavaScript 前端

利用YashanDB数据库提升产品开发效率

数据库砖家

利用YashanDB数据库提升智能物流数据管理水平

数据库砖家

智源研究院26届“智星”科技人才计划正式启动

智源研究院

Pickle 开源 AI 桌面助手 Glass:捕捉屏幕生成结构化信息;邱锡鹏团队开源对话语音模型 MOSS-TTSD丨日报

声网

赋能AI金融:低代码平台的工程实践与未来展望

电子尖叫食人鱼

AI 低代码 金融

利用YashanDB数据库提升网站用户体验的策略

数据库砖家

电脑卡顿反应慢的原因及解决方法

阿拉灯神丁

电脑选购 CleanMyMac 电脑运行缓慢 Mac电脑使用教程 mac电脑维护工具

MySQL查询执行顺序:一张图看懂SQL是如何工作的

不在线第一只蜗牛

MySQL sql

利用YashanDB实现智能数据流处理

数据库砖家

MySQL 多版本并发控制

不在线第一只蜗牛

MySQL

Disk Graph|扇形图+矩形图双模式,清理磁盘空间超直观

柠檬与橘子

1688图片搜索API,根据图片搜索相似商品

tbapi

1688API 1688图片搜索接口 1688拍立淘接口

利用YashanDB数据库实现跨地域数据同步攻略

数据库砖家

释放 IoT 数据价值,时序数据库 TDengine 上榜 2024 中国物联网创新产品榜

TDengine

tdengine 物联网 时序数据库

动态风险控制:嘉为蓝鲸CPack黑白名单保障制品全周期安全

嘉为蓝鲸

DevOps 智能运维 CPack 黑白名单

嘉为蓝鲸亮相GOPS全球运维大会·2025北京站,彰显研运领域硬核能力!

嘉为蓝鲸

智能运维 GOPS全球运维大会 研运一体化

利用YashanDB数据库实现实时数据同步的方案

数据库砖家

利用YashanDB数据库实现数据共享与协作

数据库砖家

商品中心—库存分桶高并发的优化文档

量贩潮汐·WholesaleTide

Java JavaScript 前端

破局研运数据孤岛:嘉为蓝鲸CFlow实现全链路精准跟踪

嘉为蓝鲸

DevOps 智能运维 价值流管理 CFlow

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