Kotlin Null Safetyについて知ろう
Null Safety
KotlinにはNull Safetyという言語仕様があります。この記事ではNull Safetyとは何かとKotlinにおいてNull Safetyに係るる構文を解説します。
Null Safetyとは
Null Safetyとは、端的にいうとnull参照による実行時エラーを防ごうという仕組みです。
Javaではnullに対してメンバアクセスをしようとすると、実行時エラーが吐かれます。そう、悪名高きNullPointerExceptionです。NullPointerExceptionによってアプリがクラッシュして泣いてきたプログラマーは多いことでしょう。
Null Safetyを取り入れた言語(Kotlin以外にもSwift等)はnull参照による実行時エラーを駆逐するために、nullの危険があるコードはコンパイルエラーとする設計方針をとっています。
Null Safetyの仕組みにより問題のあるコードはコンパイル時に発見できるため、問題に対して早期に対応でき不用意なクラッシュを防ぐことができるのです。
それではKotlinでは具体的にどのようにしてNull Safetyを実現しているのかを見ていきます。
nullableとnon-null
Kotlinでは、nullが代入可能(nullable)な変数と不可(non-null)の変数を区別します。
nullableは型に?をつけることで宣言できます。non-nullにnullを代入しようとするとコンパイルエラーになります。
(もちろん引数や戻り値の場合も同様です)
val nullable: String? = null val nonNull: String = null //コンパイルエラー
また、nullableな変数は不用意なアクセスを許しません。nullableはnullが代入されている可能性があるからです。
val nullable: String? = "hello" val length = nullable.length //コンパイルエラー
そこでnullableな変数にアクセスするにはnullかどうかのチェックが必ず必要になります。
nullチェック
条件式を用いたチェック
nullチェックの方法の一つは条件式です。
val nullable: String? = "hello" if (nullable != null) { val length = nullable.length }
ブロック内では非nullであることが保証される(valの宣言の変数のみ)のでアクセスできるようになります。
safe call演算子
もう一つの方法がsafe call演算子 ?. を使う方法です。
val nullable: String? = "hello" val length = nullable?.length
?. を用いることで、非nullのときはそのまま処理を行い、nullのときはnullを返すようになります。
エルビス演算子
?. を用いてnullだった場合にnullではなく特定の値を返したいときはエルビス演算子を用います。
val length = nullable?.length ?: 0 //val length = if (nullable != null) nullable?.length else 0 と同等
非nullのときは?:の左辺をnullのときは右辺を返します。
!!演算子
nullableに対して強制的にアクセスするのであれば!!演算子が使えます。
val length = nullable!!.length
非nullの場合は?.同様アクセスできますが、nullのときはNullPointerExceptionが投げられます。
!!の利用は慎重に検討しましょう。
おわりに
KotlinにおけるNull Safetyの扱いを説明しました。
Null Safetyは今やKotlinに限らず多くの言語で取りいられるようになってきている概念です。今後標準になるはずですから
適切に扱えるようになりたいところですね。