Dart 做为 Flutter 钦定的语言,随着 Flutter 的火热走进了咱们的视线。网上有不少针对它的非议,其中就包括 空安全。好比这篇文章,文章中有这么一段话。html
- 记住, Dart 没有空安全,不要觉得不加问号的地方就必定不是 null
- 凡是你没有初始化的地方全是 null !
不能说他错,但这段话很容易让人误解,仿佛 Dart 跟 Java 同样,没有空安全这个语言特性。那 Dart 究竟是不是空安全的呢,应该说 Dart 在必定程度上是空安全的。究竟是不是,取决于怎么定义空安全。安全
上面那篇文章是拿 dart 跟 kotlin 比较得出的结论,kotlin 咱们都比较熟悉了,的确是空安全的,这也是他与 Java 的主要区别和吸引人的特性。具体咱们能够看官方文档, 简而言之kotlin的引用分可空和非空两种类型,对于可空类型则提供安全的调用方法好比 a?.foo()
,从而消灭 The Billion Dollar Mistake。与 Kotlin 比较, Dart能够说是 作了一半,其实 Dart 早在2015年8月的时候就在1.12版本中添加了一个针对空安全的语言特性——Null-aware operatorslua
??
: if null operator.expr1 ?? expr2
evaluates toexpr1
if notnull
, otherwiseexpr2
.??=
: null-aware assignment.v ??= expr
causesv
to be assignedexpr
only ifv
isnull
.x?.p
: null-aware access.x?.p
evaluates tox.p
ifx
is notnull
, otherwise evaluates tonull
.x?.m()
: null-aware method invocation.x?.m()
invokesm
only ifx
is notnull
.
我尝试着解释下:code
??
是判空操做符,表示若是??
左边的表达式不为空则是左边的值不然是右边的。好比 int a = b ?? 1;
,若是 b 是空的,则 a=1,不然a=b。 是否是看着很眼熟?没错,这至关于 kotlin 中的 Elvis操做符?:
。??=
空感知赋值,被赋值的变量为空的时候才对他赋值。这个操做符其实至关于上一个的语法糖,a ??= b
等于 a = a?? b
。可见,Dart 虽然缺少严格的空安全类型系统,可是在使用侧利用空感知操做符这种语法糖相比 Java 简化了判空操做,空感知赋值操做符甚至是 kotlin 都缺少的(虽然能够用 Elvis 间接实现),某种意义上是灵活地实现了空安全。cdn
Dart 究竟是不是空安全的,你们如今应该内心有数了。其实Dart做为Google在2011年开源的现代语言,确定是有从其余语言上吸收不少教训,解决了不少痛点的,毕竟Google当初还想用他来取代 JS 成为下一代Web开发语言来着(虽然失败了:) 。我刚开始接触这门语言的时候,也以为没 Kotlin 用着舒服,但在深刻的使用后发现 Dart 也是很优秀的。Dart 同时也在茁壮成长(看 Dart 的 Github 就知道),Google对他倾注了不少精力,咱们要对它有信心哈。htm