写点什么

新的 JEP 草案发布,将在 Java 中引入可选空值标记

Ben Evans

  • 2024-09-14
    北京
  • 本文字数:2027 字

    阅读完需:约 7 分钟

新的JEP草案发布,将在Java中引入可选空值标记

之前我们报道了 JSpecify 1.0.0 版本的发布。这个版本主要引入了类型使用注解,用于指示静态类型的空值状态。


与之相关的是,JEP 8303099 草案 最近已对外公布。这个 JEP 探讨了 Null-Restricted 和 Nullable 类型,旨在将可选的空值标记引入到 Java 中。


该提案的核心是在类型使用上引入明确的标记——不仅仅是注解,指明在特定使用场景中允许的值是否包括。需要注意的是,这个提案目前还处于初步开发阶段(例如,它尚未获得正式的 JEP 编号),因此其语法在未来有可能会发生变化。尽管如此,目前的提案借鉴了 Kotlin 的标记方式,因此,对于类型,有三种使用方式:


  • Foo! 表示 Null-Restricted——这种类型可接受的值不包括;

  • Foo? 表示 Nullable——这种类型可接受的值包括 ;

  • Foo 没有明确指定是否接受。


使用未加修饰的 Foo 作为默认选项,这样做是为了保持现有代码在编译时的语义不变。


目前,该提案要求对于每一个类型的使用都进行注解,即尚不支持将整个类或模块标记为 Null-Restricted(比如像 JSpecify 那样),尽管这个功能可能会在未来引入。


这个新特性引入了一种空值转换机制(类似扩展和拆箱转换)。例如,以下这些赋值是被允许的:


  • 将 Foo! 赋值给 Foo?;

  • 将 Foo! 赋值给 Foo;

  • 将 Foo? 赋值给 Foo;

  • 将 Foo 赋值给 Foo?。


这种属于约束放宽——例如,任何 Null-Restricted 的值都可以被放在 Nullable 的值中。


也有窄化空值的转换,例如:


  • 将 Foo? 赋值给 Foo!;

  • 将 Foo 赋值给 Foo!。


这些可能会导致运行时错误,例如尝试将 null 从一个 Foo? 赋值给 Foo!。通常的策略是将这些情况视为编译时警告(而不是错误),并引入运行时检查,如果检测到违反空值界限,就抛出 NullPointerException。


请注意,这些例子仅展示了一些基础情况,实际当中可能存在更为复杂的情形。例如,在处理泛型时,编译器可能会面临类型参数的空值属性与其声明的界限不匹配的情况。


引入空标记不仅增强了编译时的安全性,还支持逐步采用的策略——首先定义类型允许的空值,然后通过解决编译时警告来逐步优化代码。


InfoQ 采访了 Kevin Bourrillion(谷歌核心库团队创始人,现在是 Oracle Java 语言团队成员),深入了解该项目的更多细节。

InfoQ:你能介绍一下你在 Java 空值处理方面的专业背景和相关经验吗?

Bourrillion: 我与其他一些人共同创立了 JSpecify 小组,并一直是主要的“设计师”(这个角色可以被理解为在推动复杂设计决策过程中达成共识的人)。尽管现在我加入了 Oracle,仍然以相似的方式继续参与项目。

InfoQ:这个 JEP 与 JSpecify 的工作有哪些重叠的地方?

Bourrillion: 最终我们将拥有一个支持空值标记的 Java 版本。JSpecify 在精确定义注解语义的含义方面完成了艰巨的任务。这意味着无论项目选择怎样的升级时间表,都将处于一个非常有利的位置,能够从 JSpecify 的注解平滑迁移到语言级别的空值标记——实际上,这种迁移应该是高度自动化的。

InfoQ:JEP 8303099 草案和 Java 5 中添加泛型的方式似乎有一些相似之处。这么说对吗?都是一种编译时机制,大部分信息会在字节码级别被擦除,是这样吗?

Bourrillion: 是的。我们认为类型擦除和所谓的“堆污染”是不得已的妥协,但正是这种设计让特性更容易被广泛采用。这也正是为什么现在几乎看不到原始类型的原因(至少我希望如此!)。空值污染将是一个长期存在的问题,但这没关系!现在全部都是关于空值污染。


正如泛型类型信息一样,空值注解在运行时通过反射发挥作用,但不参与运行时类型检查。我很好奇是否会有人基于我们的注解开发一个注入空检查的字节码工具;我认为这可能会非常有用,但也可能存在不值得投入精力的情况;我们只能等待并观察市场和技术社区的反应。

InfoQ:空值限制也是 Project Valhalla 的一个重要话题,不是吗?你能分享一些这个 JEP 草案与 Valhalla 项目正在进行的工作之间的相互影响和互动吗?

Bourrillion: 这实际上是同一个问题;Valhalla 项目是在这个 JEP 草案的基础上进一步构建的。知道哪些值不能为空将有助于虚拟机优化这些间接调用。

InfoQ:从中期到长期来看,JSpecify 应该能够为 Java 语言级别的空值支持提供一个平滑的过渡路径。它已经能够与 Kotlin 的空值支持相协调。对于开发者采用 JSpecify,你有哪些建议?

Bourrillion: JSpecify 目前处于 1.0.0 版本,尽管注解的定义已经相当精确,但规范仍有可能会经历一些细微的调整。所以,如果你现在开始对你的代码库进行注解,你的代码不太可能突然无法编译,但在一些小的规范修订后,你可能需要在某些地方移除或增加一些 @Nullable 注解。


如果你发现将空值分析集成到现有的工具链中过于耗时,因为你需要清理所有的警告,那么采用@SuppressWarnings注解是完全可以接受的!虽然这可能看起来不够优雅,但你可以随着时间的推移逐步对它们进行清理。即使这可能需要很长时间,但关键在于新代码从现在开始就有了空值检查,而这才是最需要关注的部分。


InfoQ:感谢接受采访!


查看英文原文:

https://www.infoq.com/news/2024/08/null-restricted-java/

2024-09-14 00:0910958

评论

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

MCP+A2A协议如何推动AI智能体进化为超级分布式网络

测试人

人工智能 软件测试

HarmonyOS运动开发:如何绘制运动速度轨迹

王二蛋和他的张大花

鸿蒙

区块链ETF软件系统的开发

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

重磅预告!《AI融合高等教育白皮书》即将发布,专家集聚解读先行探索,邀您共同见证

ModelWhale

人工智能 AI+学科白皮书 人工智能通识教育 人工智能教育

Taro on Harmony C-API 版本正式开源

京东零售技术

webgl技术在3D展示中的应用

北京木奇移动技术有限公司

软件外包公司 webgl技术 3D展示

信创 CDC 实战 | OGG、Attunity……之后,信创数据库实时同步链路如何构建?(以 GaussDB 数据入仓为例)

tapdata

GaussDB 实时同步 StarRocks 实时数仓 Doris 实时同步 数据同步方案 TapData 数据集成

有哪些类似于jobleap.cn的职业发展相关平台

Y11

求职 找工作 就业 失业

【等保知识】过等保单位如何选择备案地?新政策依据是什么?

行云管家

等保 等级保护 等保测评

案例解读:CST如何直接导入弯折后的PCB

思茂信息

cst CST软件 CST Studio Suite

国产CPU品牌汇总以及作用简单介绍

行云管家

信创 国产化

深入解析:AI 智能体的八个关键概念

测试人

人工智能

“深时数字地球”国际大科学计划系列工作坊持续开放!专业友好可复现,赋能科学智能生态合作(2)

ModelWhale

科学智能 DDE 深时数字地球 AI4S

提供真实场景需求,全球DePIN项目总链上市值已达71亿美元

PowerVerse

Amoro + Flink CDC 数据融合入湖新体验

Apache Flink

大数据 flink 实时计算 Flink CDC

【融麟科技】WeOps赋能CMDB与自动化管控驱动企业IT资源高效管理!

嘉为蓝鲸

CMDB 智能运维 #WeOps

SpringBoot性能优化的12个小技巧

电子尖叫食人鱼

spring

区块链ETF软件系统的核心功能

北京木奇移动技术有限公司

区块链技术 软件外包公司 区块链ETF

“深时数字地球”国际大科学计划系列工作坊持续开放!专业友好可复现,赋能科学智能生态合作(3)

ModelWhale

科学智能 DDE 深时数字地球 AI4S

【FAQ】HarmonyOS SDK 闭源开放能力 —Account Kit(4)

HarmonyOS SDK

harmoyos

小程序容器技术驱动SuperApp生态重构:前端框架新范式

xuyinyin

系统人看过来!六大要点助你搞懂进销存系统!

积木链小链

数字化 智能制造 进销存系统

《算法导论(第4版)》阅读笔记:p134-p155

codists

算法

备份历史可查 + 元数据留存,助力制品版本追溯与合规审计

嘉为蓝鲸

DevOps 智能运维 制品库

嘉为蓝鲸 WeOpsV5.22&V4.22 接入大模型:打造 AI 创新运维场景

嘉为蓝鲸

智能运维 #WeOps

淘宝天猫店铺商品API接口全方位接入指南

tbapi

淘宝API 天猫API 天猫店铺所有商品接口 淘宝店铺所有商品接口

【HarmonyOS 5】多目标产物构建实践

深海的鲸同学 luvi

鸿蒙 HarmonyOS DevEco Studio HarmonyOS SDK应用服务

智能运维平台 OpsPilot:Jenkins 流水线全链路优化实践

嘉为蓝鲸

智能运维 #WeOps OpsPilot

开源鸿蒙智能手表生态暨新品发布:开启穿戴产业新纪元

极客天地

新的JEP草案发布,将在Java中引入可选空值标记_大前端_InfoQ精选文章