Kotlinを学び始めの初心者がサンプルソースコードを読んでいると、名前も用法も分からない記号に遭遇します。?.
とか!!
とかですね。名前が分からないのでググるのも苦労しますね。このページではそういったKotlin特有の記号の用法について説明します。
Nullable記号 ?
var s1: String? = null // OK
var s2: String = null // Error
変数の型についている?
(クエスチョンマーク、はてなマーク)は、その変数がnullになり得る(nullを代入できる)ことを示しています。Kotlinでは変数がnullになり得るかどうかを厳密に区別します。?
がついている型をNullable、ついていない型をNon-Nullといいます。
安全呼び出し (Safe Call) ?.
val i1: Int? = 1
val s1 = i1?.toString() // "1"
val i2: Int? = null
val s2 = i2?.toString() // null
Nullableな変数のメンバ変数やメソッドにアクセスするには、変数の後ろに?.
(クエスチョンマーク、はてなマークと、ドット)をつけます。この記法を使うと、変数がnullでない場合は通常のメンバアクセスになり、nullの場合はメンバアクセスせずにnullを返します。上の例では、i1
はnullではないのでtoString()
が呼び出されてs1
には文字列"1"
が代入されますが、i2
はnullなのでtoString()
は呼び出されず、s2
にはnullが代入されます。Javaなどではnullに対してメンバアクセスしようとすると例外が発生しますが、Kotlinではそれを防げるというわけです。
Not-Null Assertion Operator !!
val i: Int? = 1
val s = i!!.toString()
変数の後ろに!!
(エクスクラメーションマーク、びっくりマークを2個)をつけると、Nullableな変数を強制的にNon-Nullに変換します。もし変数がnullだった場合は、例外が発生します。Kotlinのnullに対する安全性を損ねてしまうので、基本的には使わないほうがよいでしょう。
エルビス演算子(Elvis Operator) ?:
val s1: String? = "Hello"
val s2: String = s1 ?: "default"
?:
(クエスチョンマーク、はてなマークと、コロン)は、エルビス演算子(Elvis Operator)といいます。この演算子は、第1項がnullでない場合は第1項の値を返し、nullの場合は第2項の値を返します。変数がnullの場合には特定のデフォルト値を使いたい場合などに有用です。