Kotlinの特徴: Null Safetyの理解と活用!
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では、これがNullPointException
(NPE
)だ。
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