Dart 究竟是不是空安全的

究竟是不是

Dart 做为 Flutter 钦定的语言,随着 Flutter 的火热走进了咱们的视线。网上有不少针对它的非议,其中就包括 空安全。好比这篇文章,文章中有这么一段话。html

  1. 记住, Dart 没有空安全,不要觉得不加问号的地方就必定不是 null
  2. 凡是你没有初始化的地方全是 null !

不能说他错,但这段话很容易让人误解,仿佛 Dart 跟 Java 同样,没有空安全这个语言特性。那 Dart 究竟是不是空安全的呢,应该说 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 to expr1 if not null, otherwise expr2.
  • ??=: null-aware assignment. v ??= expr causes v to be assigned expr only if v is null.
  • x?.p: null-aware access. x?.p evaluates to x.p if x is not null, otherwise evaluates to null.
  • x?.m(): null-aware method invocation. x?.m() invokes m only if x is not null.

我尝试着解释下:code

  1. ?? 是判空操做符,表示若是??左边的表达式不为空则是左边的值不然是右边的。好比 int a = b ?? 1;,若是 b 是空的,则 a=1,不然a=b。 是否是看着很眼熟?没错,这至关于 kotlin 中的 Elvis操做符?:
  2. ??= 空感知赋值,被赋值的变量为空的时候才对他赋值。这个操做符其实至关于上一个的语法糖,a ??= b 等于 a = a?? b
  3. 空感知访问,至关于Kotlin的Safe Calls,不赘述。
  4. 空感知方法调用,一样很少说。

可见,Dart 虽然缺少严格的空安全类型系统,可是在使用侧利用空感知操做符这种语法糖相比 Java 简化了判空操做,空感知赋值操做符甚至是 kotlin 都缺少的(虽然能够用 Elvis 间接实现),某种意义上是灵活地实现了空安全。cdn

为Dart正名

Dart 究竟是不是空安全的,你们如今应该内心有数了。其实Dart做为Google在2011年开源的现代语言,确定是有从其余语言上吸收不少教训,解决了不少痛点的,毕竟Google当初还想用他来取代 JS 成为下一代Web开发语言来着(虽然失败了:) 。我刚开始接触这门语言的时候,也以为没 Kotlin 用着舒服,但在深刻的使用后发现 Dart 也是很优秀的。Dart 同时也在茁壮成长(看 Dart 的 Github 就知道),Google对他倾注了不少精力,咱们要对它有信心哈。htm

相关文章
相关标签/搜索