Kotlinの非ヌルアサーション(!!)演算子
1. 概要
Kotlinでは、nullabilityは、NullPointerExceptionを回避するのに役立つ型システム機能です。
このクイックチュートリアルでは、null以外のアサーション( !! )演算子を紹介し、それをいつどのように使用するかを確認します。
2. Not-Nullアサーション
Kotlinの各型には、1つのnull許容形式と別の非null許容形式があります。たとえば、Int型はnull以外の32ビット整数を保持できます。 同じ値に加えて、 Int?タイプはnull値も保持できます。
Kotlinには、null許容データ型を安全に処理するを容易にするための多くのオプションが用意されています。
ただし、null許容型をnull許容型に強制的に変換する必要がある場合があります。 結局のところ、Kotlinのnullではないアサーション演算子!!はまさにそれを実行します。
val answer: String? = "42"
assertEquals(42, answer!!.toInt())
確かに答え nullではない場合は、
この演算子をnull値に適用すると、Kotlinはjava.lang.NullPointerExceptionのインスタンスをスローします。
@Test
fun givenNullableValue_WhenIsNull_ThenShouldThrow() {
assertFailsWith<NullPointerException> {
val noAnswer: String? = null
noAnswer!!
}
}
また、応募すれば
val answer = "42"
answer!!.toInt()
ただし、文句を言って、警告メッセージを表示します。
Unnecessary non-null assertion (!!) on a non-null receiver of type String
3. ユースケース
ただし、一部のサードパーティライブラリを操作している間は、とにかくこの演算子を使用する必要がある場合があります。 たとえば、SpringDTOでBeanValidationアノテーションを使用しているとします。
data class NewUserDto(
@get:NotNull
val username: String? = null
)
Springは検証ルールをリクエストデータに自動的に適用します。 したがって、検証が行われた後、ユーザー名がnullではないことを確認します。
val request: NewUserDto = // from controller
userService.registerUser(request.username!!)
コンテキストから値がnullでないことはわかっていますが、Kotlinコンパイラにはこの情報を推測する方法がありません。 したがって、ここでは!!演算子を使用する必要があります。
4. 結論
このクイックチュートリアルでは、Kotlinのnull可能性のもう1つの側面である非nullアサーション演算子について理解しました。
いつものように、すべてのサンプルはGitHubでから入手できます。