尝鲜Dart2.7最新语法之可空与⾮空类型
从这篇⽂章开始将进⼊ Dart 2.7 新特性的世界。我特别想⽤ Dart 官⽅⼀句话来描述 Dart 2.7:
A safer, more expressive Dart.(更安全,更具表现⼒的 Dart)
因为在 Dart 2.7 添加了对扩展⽅法的⽀持,以及⼀个⽤于处理带有特殊字符的 characters package(preview)。此外,在 DartPad 中更新了对空安全(preview,类型安全可为可空和⾮空的类型)⽀持。
为什么更安全?
如果学过 Java 的编程语⾔就知道,我们经常会遇到 NPE(NullPointerException)的问题(俗称:空指针运⾏时异常)。然后学过Kotlin 也会知道,Kotlin 相⽐ Java 最⼤优点之⼀就是可以极⼤避免 NPE 的问题,可是有⼈是否去思考为什么 Kotlin 能够很好解决 NPE 的问题。
其实 Kotlin 能够解决 NPE 的问题,本质是 Kotlin 对它的类型系统做了⾮空和可空类型的划分。⽐如定义⼀个⾮空的变量,若没有初始化则会静态提⽰报错,只有选择延迟初始化或者⽴即初始化报错提⽰才会消失,那么在使⽤这个变量的使⽤就能确保它是初始化过的,所以⾃然不可能出现空指针问题;⽐如定义⼀个可空的变量时,当在使⽤这个可空变量时,IDE 就会提⽰你需要对它做判空处理,这样⼀来⾃然也就不可能出现空指针问题了。
然⽽ Dart 的可空与⾮空类型和 Kotlin 的⽬的是⼀样的。因为在 Dart 没可空⾮空划分之前,Dart 和 Java 是⼀样:定义⼀个变量后不⽴即初始化,编译器不会报错;然后开发者随着后⾯代码逻辑冗长和复杂,忘记了初始化直接使⽤这个变量,然⽽这在编译期也⽆法检测到,⼀旦运⾏时执⾏就抛出异常。
未加⼊对 non-nullable ⽀持的 Dart 版本(⽬前稳定正式版本):
运⾏结果:
加⼊对 non-nullable ⽀持的 Dart 版本(⽬前还是 experimental 中):
那么通过上⾯ IDE 编译期静态检查就能很好提醒开发者,在使⽤ name 变量前需要被初始化。这样以致于不会把异常抛到运⾏时。
为什么更具表现⼒?
因为新增了扩展⽅法的⽀持,也就意味着可以任意扩展你想要扩展类的⽅法。何为扩展⽅法,⽤⼀句话概括:它能实现对⼀个已经存在的类
(这个类可能存在于不可修改的库中)扩展新增对应⽅法,然后在使⽤的过程中就像是直接调⽤这个类的成员⽅法⼀样。举个例⼦:
void main() {
String lowercase = "ADsfc".toLowerCase();//toLowerCase 是 String 类成员⽅法,可以直接使⽤ .toLowerCase() 直接调⽤
print(lowercase);
java编译器ide最新版下载int intValue = '200'.toInt();//然⽽ toInt() 并不是 String 类的成员⽅法,但是由于它是⼀个 String 类扩展⽅法,可以类似成员⽅法那样调⽤
print(intValue);
double doubleValue = '3.1415926'.toDouble();//然⽽ toDouble() 也不是 String 类的成员⽅法,但是由于它是⼀个 String 类扩展⽅法,可以类似成员⽅法那样调⽤ print(doubleValue);
}
//定义⼀个在 String 类中的扩展
extension ParseNumbers on String {
int toInt() {
return int.parse(this);
}
double toDouble() {
return double.parse(this);
}
}
1. 为什么需要加⼊ non-nullable 的⽀持?
加⼊ non-nullable 的⽀持,可以更加健全 Dart 的类型系统;从⽽使得类型系统更加安全,很⼤避免了类似 Java 中 NPE 问题,在 Dart
上则是对⼀个 Null 调⽤⽅法,会表现是 NoSuchMethodError 的异常。
从 Dart 官⽅路线来看,Dart 要⽀持 non-nullable 特性从很早之前就开始了,⼀直处于计划中,⽤官⽅的话说:由于 Dart 和 Kotlin、C#、Swift ⼀样也没有原语类型或值类型,因此 non-nullable 可以提供性能上的优势。具体参考:
2. 加⼊ non-nullable 后对开发有什么影响?
通过上⾯介绍我们知道,⽬前 Dart 版本并没有正式⽀持 non-nullable,所以在定义⼀个变量的时候,即使不对它初始化也不会出现静态提⽰错误。
2.1 当在声明定义变量时,⼀定要做初始化或者延迟初始化
⽐如现在的 Dart 你可以这样:
但是加⼊ non-nullable 后你会得到静态提⽰错误:
解决⽅法:
声明时⽴即初始化
late 关键字实现延迟初始化
所以,总结⼀下最⼤影响在于:在加⼊ non-nullable 的⽀持后,当在声明定义变量的时候,⼀定要做初始化或者延迟初始化(⼀般使⽤late 关键字,后⾯会详细讲解,但是需要注意的是使⽤ late 延迟初始化,使⽤该变量前⼀定要确定在这之前要初始化,否则也会抛出异常)。
2.2 当在声明定义某个变量时,⼀定要先考虑当前变量是可空还是⾮空
在声明⼀个可空类型变量的时候,就需要在使⽤的时候⼿动判空处理;声明⼀个⾮空变量的时候就会提⽰是否初始化或延迟初始化。
3. 官⽅对 non-nullable ⽀持进度
3.1 GitHub 最新 commit 的进度
其实,官⽅⼀直在致⼒于 non-nullable 特性的⽀持,通过最近 GitHub 提交的记录就能看出,随便抽取最近的 commit:
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论