1. 首页 > 快讯

Java 拟引入全新语法:再见空指针!

Java 语言在处理null引用方面一直让开发者头疼。尽管许多开发者在编码时假设某些变量永远不会是null,但在现有的 Java 语法中却无法明确表达这一意图,导致潜在的空指针异常(NullPointerException)无处不在。

为了解决这一痛点,Java 正在引入一项新的预览特性——Null-Restricted 和 Nullable 类型。[1]这项特性旨在让开发者能够在类型定义中明确指出该类型是否允许null值,从而在编译时和运行时提供更强的类型安全和检测机制。

例如下:

  • Foo!是非空限制类型 - 这种类型的可接受值不包括null。
  • Foo?是可空类型 - 这种类型的可接受值明确包括null。
  • Foo未指定是否接受null- 这种类型没有明确说明是否可以接受null。

特性亮点

  1. 明确表达类型的空值限制:开发者可以使用Foo!表示不允许null的类型,使用Foo?表示允许null的类型。而默认的Foo类型仍不指定空值限制。

  2. 兼容现有代码:新特性可以逐步引入,保证与传统 Java 代码的兼容性。无需一次性重构所有代码,也不需要修改现有的标准库。

  3. 自动检测并警告潜在的空指针异常:类型转换时,Java 编译器会自动检查可能的null处理不当情况,并给出警告。例如,将Foo?转换为Foo!时,编译器会在运行时插入检测,防止null引发异常。

  4. 字段和数组的严格初始化:对于声明为null限制的字段和数组,Java 要求在它们被读取前必须初始化,否则将抛出异常。例如,String![] labels在初始化时必须为每个元素提供初始值。

  5. 灵活的 nullness 转换:类型之间可以进行似于自动装箱和拆箱机制。这使得在不同空值类型间的转换更加自然,但潜在的风险仍会在运行时被检测到。

展望未来

虽然这项特性目前只是预览版,但它为 Java 开发者提供了强大的工具来更好地控制空值处理。在未来,我们有望看到更多 API 采用这些新语法,甚至有可能出现让整个类或模块默认使用null限制的功能。

这对于开发者来说无疑是一个重大利好,将 Java 推向更健壮、更安全的编程语言迈出了一大步。

对比 TypeScript

在 TypeScript 中,!和?这两个符号有不同的含义,分别用于处理可选属性、非空断言。

1.!非空断言

!在 TypeScript 中被称为非空断言操作符。它告诉编译器,某个变量或属性在使用时一定不是null或undefined,即使编译器无法静态推断这一点。

示例:

letname:string|null="Alice"; console.log(name!.toUpperCase());// 非空断言,假定 name 不会为 null 

在这个例子中,name!表示我们确信name不是null。如果实际值是null,那么在运行时仍然可能会抛出错误,但编译器不会报错。

常见使用场景:

  • 当你确定一个值在某些情况下不会为null或undefined,但编译器无法推断时使用。
  • 在处理 DOM 元素或第三方库数据时,常见于 TypeScript 项目中。

2.?可选属性/可选参数

?在 TypeScript 中用于声明可选属性可选参数。它表示该属性或参数可以不存在,或者它的值可以是undefined。

示例 1:可选属性

interfacePerson {
name:string;
age?:number;// 可选属性 } constalice: Person = { name:"Alice"};// 可以不提供 age 属性 

使用?标记的属性或参数是可选的,意味着可以不赋值或不传递。


你对 Java 的这个新特性感兴趣吗?欢迎在评论区分享你的看法!

参考资料[1]

Java 一项新的预览特性——Null-Restricted 和 Nullable 类型。:https://openjdk.org/jeps/12



本文采摘于网络,不代表本站立场,转载联系作者并注明出处:https://www.iotsj.com//kuaixun/3793.html

联系我们

在线咨询:点击这里给我发消息

微信号:666666