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

相關文章
相關標籤/搜索