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の人気の使い道のチュートリアルを要チェックです!