以下の内容はhttps://uga-box.hatenablog.com/entry/2024/08/26/000000より取得しました。


【Kotlin】エルビス演算子と強制アンラップ

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でないことを確認済み
}



以上の内容はhttps://uga-box.hatenablog.com/entry/2024/08/26/000000より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14