Kotlin初心者が最初に覚えるべき「nullable地獄」回避パターン集

スポンサーリンク

導入:Kotlinの「nullable地獄」、ここで詰まる

Kotlinを書き始めて、だいたい最初にこうなります。

「? が多すぎて何が何だかわからない」
「!! を付けたら落ちた」
「結局nullって何?」

これ、ほぼ全員が通る道です。安心してください。

この記事では、Kotlin初心者が最初に覚えるべき nullable(null許容)回避パターンを、
コピペで動く例 → 実務の落とし穴 → 設計視点までまとめます。

先に結論です。

  • !! は原則使わない
  • nullは「受け取り口」で潰す
  • 設計でnullableを減らすのが最強

基礎:nullableとは何か

Kotlinでは、nullが入るかどうかを型で表します。


var name: String = "Taro"   // nullは入らない
var nickname: String? = null // nullが入る

ここがJavaとの一番の違いです。
null安全をコンパイル時に守るのがKotlinの思想です。

なぜ「地獄」になるのか

nullableをそのまま伝播させると、


user?.profile?.address?.zipCode

みたいなコードが量産されます。
読めない・直せない・怖い。ここで心が折れます。

まず覚える最小パターン集

① Elvis演算子(?:)


val name = user.name ?: "未設定"

nullだった場合のデフォルト値を決める基本技です。

② letでnullチェック


user?.let {
    // userがnullでない時だけ実行
    showUser(it)
}

UI更新や副作用のある処理でよく使います。

③ requireNotNull / checkNotNull


val id = requireNotNull(userId) { "userId must not be null" }

「ここでは絶対nullじゃない」という設計上の保証をコードに残せます。

④ safe call + return


val user = repository.getUser() ?: return

早期リターンで、以降の処理をnon-nullにできます。

実務でのnullable地獄パターン

① !! の常用

「動くから」で !! を付け始めると、
クラッシュ製造機になります。

② nullableをDTOからUIまで引きずる

APIレスポンスのnullableをそのままViewまで持ってくると、
画面全体が ? だらけになります。

③ プロパティをvar + nullableで逃げる

「後で入るから null」で設計すると、
初期化タイミングが地獄になります。

④ non-null前提なのに型がnullable

コードと設計の意図がズレているサインです。

安全に書くベストプラクティス

場面おすすめ
APIレスポンスnullableで受ける
UseCase / Repositorynullを変換・補正
UI層原則non-null

nullableは境界で処理する
これを意識するだけでコードが激変します。

応用:設計でnullableを消す

初期化必須コンストラクタ


data class User(
    val id: String,
    val name: String
)

nullableを許さない設計が一番強いです。

UIモデルを別で作る

APIモデルとUIモデルを分けると、
UI側はnon-nullだけで書けます。

sealed classで状態を表現


sealed class UiState {
    object Loading : UiState()
    data class Success(val user: User) : UiState()
    object Error : UiState()
}

nullの代わりに状態で表すのが上級者パターンです。

デバッグ・確認チェックリスト

  • !! を使っていないか
  • nullableがUIまで漏れていないか
  • Elvis演算子で意図が明確か
  • 設計上non-nullなものがnullableになっていないか

よくある質問

Q. !! は完全に禁止?

原則NGですが、テストコードなど限定的な場面では許容されることもあります。

Q. nullableが多いAPIはどうする?

Repository層で変換し、UIには渡さないのが基本です。

Q. Kotlinに慣れれば自然に減る?

減ります。ただし設計を意識しないと減りません。

まとめ

  • nullは悪ではなく「設計のサイン」
  • 境界で処理すれば地獄は来ない
  • 最終的には設計で解決する

迷ったら:UI層はnon-nullにする。

コメント

タイトルとURLをコピーしました