LoginSignup
5
1

More than 1 year has passed since last update.

【Kotlin】Nullableな変数と上手く付き合ってみた

Last updated at Posted at 2022-08-31

はじめに

皆さん、ごきげんよう!れぶです!

今回の記事では、Kotlinのnull許容型の変数(以降、Nullableな変数とする)からプロパティーやメソッドを安全に呼び出す方法について列挙していきます。

自分はJava出身で、KotlinのNull Safety周りはJavaにはない概念だったのでこの記事で整理します。自分と同様にJavaからKotlinへ移行中だけど、Nullableな変数の扱い方がイマイチ分からない方に特に参考になればと思います。

それでは、参りましょう!!

Nullableな変数へアクセスする方法

今回は以下のコードを例とします。

class Person(val name:String) {

    fun hello() = println("Hello!I'm $name.")
}

fun main() {
	val person: Person? = Person("Tom")
    person.hello()
}

ただ、このままでは正しく動作しません。Nullableな変数はnullが代入されている可能性もあるため、直接アクセスするとコンパイラーになります。以下の4つの方法(!!演算子は除外)で適切にNullableな変数へアクセスしていきます。

1. 条件式

fun main() {
	val person: Person? = Person("Tom")
    if(person != null) {
        person.hello() //Hello!I'm Tom.
    }

    val person2: Person? = null
    if(person2 != null) {
        person2.hello() //処理なし
    }
}

Javaでもよくやるif文を使ったnullチェックです。

if文のブロック内ではnullでないことが保証されているため、アクセスできます。ただし、valで宣言した変数に限り、適切に機能します。

2. セーフコール演算子

fun main() {
	val person: Person? = Person("Tom")
    person?.hello() //Hello!I'm Tom.

    val person2: Person? = null
    person2?.hello() //処理なし
}

変数にセーフコール演算子?.を付けるやり方です。

演算子の左側がnullでない場合のみ、プロパティやメソッドを呼び出します。上記の例ではpersonはnullでないため、hello()を呼び出すことができますが、person2はnullであるため、処理が無視されます。

先程の条件式のやり方を1行で表せるので便利です。

3. エルビス演算子

fun main() {
	val person: Person? = Person("Tom")
    person?.hello() ?: println("nullだお") //Hello!I'm Tom.
    
	val person2: Person? = null
    person2?.hello() ?: println("nullだお") //nullだお
}

変数にエルビス演算子?:を付けるやり方です。
※上記は先程のセーフコール演算子と組み合わせています。

変数の値がnullの場合、エルビス演算子の右側の値を返したり、処理します。上記の例ではpersonはnullでないため、セーフコール演算子によりhello()を呼び出します。またperson2はnullであるため、エルビス演算子の右側のprintln()の処理を行います。

変数の値がnullの場合に、nullを返すのではなく、特定の値を返したい場合に便利です

4. スコープ関数let✖️セーフコール演算子

fun main() {
	val person: Person? = Person("Tom")
    person?.let{it.hello()} //Hello!I'm Tom.

    val person2: Person? = null
    person2?.let{it.hello()} //処理なし

【変数+セーフコール演算子】に、スコープ関数letを呼び出すやり方です。
※上記の場合だとスコープ関数runを使う方がよく見かけるかもですが。

変数がnullでない場合のみ、セーフコール演算子によりラムダ式の処理を実行します。上記の例では、personはnullでないため、ラムダ式でhello()を実行します。person2はnullであるため、処理が無視されます。

変数の値を加工したり、複雑な処理(条件文やループ処理など)をしたい場合に便利です

おわりに

今回は、KotlinでNullableな変数への適切なアクセス方法4つを記しました。

アクセス方法 特徴
条件式 Javaでお馴染み
セーフコール演算子 オーソドックス
エルビス演算子 変数がnullの場合に特定の値を返したい時に有効
スコープ関数let✖️セーフコール演算子 変数を使って複雑な処理をしたい時に有効

ただ、KotlinではNull Safetyにより、変数にnullを代入することを基本禁止していることが前提にはなりますね。

この記事が参考になると光栄です。以上です。ありがとうございました!

参考サイト

5
1
2

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
1