📑

Kotlinの特徴: Null Safetyの理解と活用!

2024/02/11に公開

Null safety:Nullable types and non-nullable types

Kotlinの特徴の中の1つとして、Null安全性(Null safety)がある。
そして、Nullを安全・便利に扱うための演算子などが用意されている。
今日はこれについて書いていきたいと思います!

Null safetyってそもそも...何?なんであるの?

Kotlin's type system is aimed at eliminating the danger of null references, also known as The Billion Dollar Mistake.

Kotlinの型システムは、null参照の危険性を排除することを目指している。
これは、The Billion Dollar Mistake(10億ドルの間違い)としても知られているものの解決だ。

Javaを含む多くのプログラミング言語でよくある落とし穴の1つは、
null参照のものにアクセスすると、null参照例外が発生することで、
Javaでは、これがNullPointExceptionNPE)だ。

Kotlinでは型システムが
nullを保持できる参照(nullable references)と
nullを保持できない参照(non-nullable references)を区別する.

Null安全型 (Nullable Type):Safe calls

値がnullであるかもしれないことを示すために使用されるもの。
その値がnullであるかもしれないという可能性を表現し、nullが許容されることを示すもの。
null安全型は、型名の後に ? を付けて宣言される。

型名の後に ? を付けて宣言
このはてな?セーフコール演算子という!

val str: String = null // ERRORになる。null非許容。
val nullableString: String? = null //コレはok

print(nullableString?.length)  // 出力は、null

Nullable Typeに操作: let

letは、Nullable型のオブジェクトに対して安全に操作を行うためのスコープ関数の一つ。
NULLでない値に対して, 特定の操作を行うには、letと一緒にセーフコール演算子を使う

ex.

val listWithNulls: List<String?> = listOf("Kotlin", null)
for (item in listWithNulls) {
    item?.let { println(it) } // prints Kotlin and ignores null
}

Nullに対してのさまざまな演算子について

エルビス演算子(elvis operator)

When you have a nullable reference, b,
you can say "if b is not null, use it, otherwise use some non-null value"

nullだった場合に、別の値に変換することが可能になるのがエルビス演算子。
nullが返却されたら困る場合は、
エルビス演算子(elvis operator)を使用することで防げる。
エルビス演算子は ?の後ろに:をつけて ?: という記号で表される。

val str: String = null // ERRORになる。null非許容。
val nullableString: String? = null //ok

print(nullableString?.length)  // null

print(nullableString?: "".length)  // 0

!!演算子(not-null assertion operator (!!) )

The third option is for NPE-lovers: the not-null assertion operator (!!) converts any value to a non-nullable type and throws an exception if the value is null. You can write b!!, and this will return a non-null value of b (for example, a String in our example) or throw an NPE if b is null

強制的に、null許容型から非許容型にすることができるもの。
Not-Null断定演算子(!!)は、任意の値をNULLでない型に変換し、
値がNULLの場合は例外(NPE)をスローするもの。
(ので、使う時は注意が必要...!)

val name: String? = "John"
val nonNullableName = name!!
// name が非nullの場合は "John" を返し、nullの場合は NPE をスロー.
println(nonNullableName) // 出力: John

val age: Int? = null
val nonNullableAge = age!! // これはage が null のため、 NPEがスローされる

Discussion