Nullセーフティ(ツアー)
Kotlinでは、null
の値をとる事がある。
プログラムにおけるnull
にまつわる問題を防ぐため、
KotlinにはNullセーフティというものがあります。
Nullセーフティは、null
にまつわる潜在的な問題を、実行時では無くコンパイル時に検出します。
Nullセーフティは以下を可能にする機能の組み合わせです:
null
の値がプログラムのどこで許容されるかを明示的に宣言null
値のチェックnull
値かもしれないオブジェクトのプロパティや関数の安全な呼び出し(セーフコール)null
が検出された時のアクションの宣言
Nullable型
KotlinはNullable型をサポートしています。Nullable型とはnull
の値が入っても良い型というものです。
デフォルトでは、型はnull
を受け入れません。Nullable型は明示的に?
を型の後ろにつけることで宣言します。
例:
length
はStringクラスのプロパティで、 文字列に含まれる文字の数を保持します。
null値のチェック
条件式の中でnull
かどうかをチェック出来ます。
以下の例では、describeString()
関数のif
文で、
maybeString
がnull
ではないか、そして長さが0より大きいかをチェックしています:
セーフコール
null
値かもしれないオブジェクトのプロパティに安全にアクセスする為に、セーフコール演算子 ?.
が使えます。
セーフコール演算子はオブジェクトがnullの時にはプロパティがnullを返すようにします。
これはnull
だった時にエラーが起こるのを防ぐのに有用です。
以下の例で、lengthString()
関数はセーフコールを使って、文字列の長さかnull
のどちらかを返します:
セーフコールはつなげる事(チェイン)が出来ます。その時はプロパティのどれかが
null
だったらnullを返す事になります。 例:person.company?.address?.country
セーフコール演算子はまた、extension関数やメンバ関数を安全に呼ぶのにも使えます。
この場合、nullチェックは関数の実行をする前に行われます。
もしこのチェックがnull
値を検出したら、関数の呼び出しはスキップされnull
が返されます。
以下の例では、nullString
はnull
なので、
.uppercase()
の呼び出しはスキップされて、
null
が返されます。
Elvis演算子を使おう!
Elvis演算子(Elvis operator) ?:
を使う事で、null
値が検出された時に返すデフォルトの値を提供する事が出来ます。
Elvis演算子の左には、null
値かどうかをチェックしたい対象を書きます。
Elvis演算子の右には、null
値が検出された時に返したい値を書きます。
以下の例では、nullString
はnull
なので、length
プロパティのセーフコールはnull
値を返します。
結果として、Elvis演算子は0
を返します:
KotlinにおけるNullセーフティについてのより詳細な情報は、Nullセーフティを参照ください。
練習問題
あなたの手元にはemployeeById
関数があります。これは会社の会社員に関するデータベースへのアクセスを提供しています。
残念なことに、この関数はEmployee?
型を返します。だから結果がnull
な事がありえます。
以上を踏まえて、社員のid
が渡されたら給料(salary)を返す関数を書いてください。ただしデータベースに社員が存在しなかったら0
を返してください。
解答例
data class Employee (val name: String, var salary: Int)
fun employeeById(id: Int) = when(id) {
1 -> Employee("Mary", 20)
2 -> null
3 -> Employee("John", 21)
4 -> Employee("Ann", 23)
else -> null
}
fun salaryById(id: Int) = employeeById(id)?.salary ?: 0
fun main() {
println((1..5).sumOf { id -> salaryById(id) })
}
次は何をやるべき?
おめでとうございます!今やKotlinのツアーを無事終了したあなたとしては、Kotlinの人気の使い道のチュートリアルを要チェックです!