一、在空安全推出之前,静态类型系统允许所有类型的表达式中的每一处都可以有 null。

从类型理论的角度来说,Null 类型被看作是所有类型的子类;

类型会定义一些操作对象,包括 getters、setters、方法和操作符,在表达式中使用。

如果是 List 类型,您可以对其调用 .add() 或 []。

如果是 int 类型,您可以对其调用 +。

但是 null 值并没有它们定义的任何一个方法。

所以当 null 传递至其他类型的表达式时,任何操作都有可能失败。

这就是空引用的症结所在—所有错误都来源于尝试在 null 上查找一个不存在的方法或属性

二、非空和可空类型

空安全通过修改了类型的层级结构,从根源上解决了这个问题。Null 类型仍然存在,但它不再是所有类型的子类。现在的类型层级看起来是这样的:

既然 Null 已不再被看作所有类型的子类,那么除了特殊的 Null 类型允许传递 null 值,其他类型均不允许。

我们已经将所有的类型设置为默认不可空的类型。如果您的变量是 String 类型,它必须包含一个字符串。这样一来,我们就修复了所有的空引用错误。

三、引入空安全后的类型顶层设计

四、空安全的适配

类型默认是非空的,可以添加 ? 变为可空的。

可选参数必须是可空的或者包含默认值的。您可以使用 required 来构建一个非可选命名参数。非空的全局变量和静态字段必须在声明时被初始化。实例的非空字段必须在构造体开始执行前被初始化。

如果接收者为 null,那么在其避空运算符之后的链式方法调用都会被截断。我们引入了新的空判断级联操作符 (?..) 及索引操作符 (?[])。后缀空断言“重点”操作符 (!) 可以将可空的操作对象转换为对应的非空类型。

新的流程分析,让您更安全地将可空的局部变量和参数,转变为可用的非空类型。它同时还对类型提升、遗漏的返回、不可达的代码以及变量的初始化,有着更为智能的规则。

late修饰符以在运行时每次都进行检查的高昂代价,让您在一些原本无法使用的地方,能够使用非空类型和 final。它同时提供了对字段延迟初始化的支持。

List 类现在不再允许包含未初始化的元素。

最新文章

  1. STL
  2. CentOS7源码编译安装Postgresql9.5
  3. 《深入浅出Node.js》第6章 理解 Buffer
  4. php生成excle
  5. git在本地仓库直接使用rm彻底删除文件,服务端还是存在
  6. 运行基准测试hadoop集群中的问题:org.apache.hadoop.ipc.RemoteException: java.io.IOException: File /benchmarks/TestDFSIO/io_data/test_
  7. JavaScript的My97Date日期工具类的使用
  8. Web Service 的服务端的引用
  9. python 字符串(汉语)获得MD5编码
  10. 前台跨站点获取session
  11. linux,shell脚本set -x的意思
  12. python代码格式
  13. 泊爷带你学go -- redis连接池的操作
  14. 人生苦短:Python里的17个“超赞操作
  15. Python和Java编程题(五)
  16. SURF算法
  17. iOS性能优化技巧
  18. window.open 浏览器差异.
  19. 很赞的idea教程
  20. 安卓上为什么不能用system.io.file读取streammingAssets目录下的文件

热门文章

  1. Whitzard OJ Introduce to packing
  2. 『动善时』JMeter基础 — 55、JMeter非GUI模式运行
  3. Django基础-002 Models的属性与字段
  4. 备战-Java 并发
  5. nacos配置本地多个实例(伪集群)
  6. react-router 基本使用
  7. 使用vue-preview报错Cannot read property 'open' of undefined
  8. python + pytest基本使用方法(运行测试&测试报告)
  9. vulnhub-DC:2靶机渗透记录
  10. 第三篇--如何修改exe文件版本号和文件信息