scala - 是否有一种类型安全的方法来确保案例类的字段在 scala 中不能为空?
问题描述
正如问题所暗示的那样,有哪些不同的方法可以确保某人不会将 null 传递给让我们说一个案例类的某些字段。
我知道需要,但不是粉丝,因为它会引发未经检查的异常。
解决方案
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
.
推荐阅读
- vlc - RTSP 流 VLC 3.0.8 的马赛克
- html - 父母非祖父母的CSS百分比定位
- vba - Excel 用户表单输入失控
- swiftui - SwiftUI 获取对象以响应另一个对象的大小
- sharepoint - 通过 Office 插件 (Word JS) 使用 Microsoft Graph 访问 SharePoint
- asp.net-core - 升级到 .net core 3.1 preview4 后使用代码分析器构建错误
- arrays - 如何在 MATLAB 的 for 循环中读取变量的内容?
- mysql - Mysql fifo查询股票
- java - 如何反转 fnv1a_64 哈希值?
- c++ - 如何在表头之外定义模板类的模板函数?