IngramChen 積分 3 編輯於

但我認為 Kotlin 缺少類似 swift 的 guard 機制,如果對於多個 nullable 物件,要確認他們均不為 null 再做某件事,程式難免會寫出許多 if null check,會讓 code 繁瑣,詳情可以參考此討論 Kotlin null check for multiple nullable vars。

這點我也不同意,swift 的 guard 實在是有點煩,跟 Java CheckedException 一樣繁鎖,寫起來很囉嗦。

問題是出在有一堆 nullable 的 type 才會有 multiple guard 這種需求,在 Swift 因為常常和 objective c 和 UIKit 對接,所以會有一堆 nullable type ,這是技術債,很難避免。

Kotlin 這裡,我沒有很多需要 multi guard 的地方,印象中最多兩個吧?因為習慣上我會偏好很早之前就把 argument 轉成 nonnull type (比方說從 restful API 過來,通常會有一堆 null,在這一層就通通擋掉了 (reject/validate/convert/default value),能進入 service 層的 nullable 並不多。

或者比方說,你有一個 boolean flag, var enable:Boolean? 。你的需求除了直覺的 enabled/disabled 兩種狀態外,還有另外一個 未設定 的狀態。然後大多數的人取捷徑就直接讓 flag 變 nullable Boolean? 達到三元狀態的需求。

我個人偏好就直接改 enum 了,省得一堆 nullable type。Kotlin 很多定義都是 one liner ,就儘量用吧

最後,如果一個物件上有一堆 nullable type field,這是一種 design smell,臭臭的,應該拆開重構才是 (Database 的 table 有一堆欄位是 null 也代表正規化做的不好)

這是文章的子討論串,你可以回到上層查看所有討論和文章
smallufo 積分 0

原來如此,沒想過這麼深。看來 JetBrains 也深思熟慮過此語法。。。