首页 > 解决方案 > 是否有一种类型安全的方法来确保案例类的字段在 scala 中不能为空?

问题描述

正如问题所暗示的那样,有哪些不同的方法可以确保某人不会将 null 传递给让我们说一个案例类的某些字段。

我知道需要,但不是粉丝,因为它会引发未经检查的异常。

标签: scala

解决方案


Scala 2由于 JVM 限制,您不能强制它进入。但是,Scala 3/Dotty其中有一个有趣的选择加入功能,称为 Explicit Nulls。

您可以在此处查看更多详细信息: http: //dotty.epfl.ch/docs/reference/other-new-features/explicit-nulls.html和此处:http ://dotty.epfl.ch/docs/internals/显式空值.html

本质上,您使用编译器标志启用此功能,-Yexplicit-nulls然后如果您违反非空性,您的代码将无法编译:

val x: String = null // error: found `Null`, but required `String`

val x: String | Null = null // ok - Union type

此外,它们对 Null 联合类型(如 Flow Typing 和 Equality)进行了额外的类型改进。

它的工作方式是编译器Null生成 的子类型Any,而不是AnyRef像以前那样强制编译时检查。但是由于 JVM 的实现方式,擦除后Null成为所有引用类型的子类型。

新的层次结构:

新的层次结构

擦除后:

擦除后

Scala 的常规做法是不使用null并假设您有行为良好的开发人员也这样做。改为使用Option。在外围,如果您不信任库/模块/等的用户,您可以使用require.


推荐阅读