Kotlinを勉強している
下の本を読んでて気になったことのメモ
エルビス演算子
末尾に ?: をつけることで、Nullの場合に行う処理を定義することができる演算子
val name: String? = null val displayName = name ?: "ゲスト" println(displayName) // "ゲスト"と出力される // 複数のエルビス演算子の連鎖 val firstName: String? = null val middleName: String? = "太郎" val lastName: String? = null val fullName = firstName ?: middleName ?: lastName ?: "名無し" println(fullName) // "太郎"と出力される // エルビス演算子と関数の組み合わせ fun getDefaultName(): String { return "デフォルト名" } val userName: String? = null val result = userName ?: getDefaultName() println(result) // "デフォルト名"と出力される
強制アンラップ
変数末尾に !! をつけると変数がNullであっても実行する
val forcedName: String = "山田" val nullableName: String? = null // 安全な使用例 println(forcedName.length) // 2と出力される // 危険な使用例(実行時エラーが発生する可能性がある) try { println(nullableName!!.length) } catch (e: NullPointerException) { println("エラー: nullableName は null です") } // 強制アンラップを使用する前に null チェックを行う例 if (nullableName != null) { println(nullableName!!.length) } else { println("nullableName は null です") }
強制アンラップはどういう時に使うのか?
Nullであっても実行するのは基本的にやめた方がいいと思うのだが、使うとしたらどういうときなのか調べた
以下の3つの場合が考えられる
①外部ライブラリやAPIからの戻り値が非null保証されている場合
fun externalLibraryFunction(): String? { // 実際には常に非nullの値を返すと仮定 return "外部ライブラリの結果" } val result = externalLibraryFunction()!! println(result.length)
②初期化後に値が必ず設定される変数の場合
class User { private lateinit var name: String fun initialize(userName: String) { name = userName } fun displayName() { println(name!!) // 初期化後に使用することが保証されている場合 } }
③テストコードでnullでないことを確認している場合
fun testFunction() { val testValue: String? = "テスト値" assert(testValue != null) println(testValue!!.length) // テストでnullでないことを確認済み }