Kotlinプラットフォームタイプ
1. 概要
このチュートリアルでは、Kotlinの用語であるプラットフォームタイプを定義します。 その後、プラットフォームタイプの処理方法を示します。 最後に、Kotlinでのnull可能性チェックをサポートするJavaアノテーションを示します。
2. プラットフォームタイプの定義
まず、プラットフォームの種類を説明しましょう。 つまり、プラットフォームタイプはJava宣言のタイプです。 Java言語のオブジェクトはnull許容です。 したがって、Kotlinはコンパイル時にKotlinでnull可能性をチェックできません。 さらに、Kotlinのコンパイラはエラーを発行できません。 さらに、プラットフォームタイプは実行時にエラーを引き起こす可能性があります。 したがって、厳密なnull-safetyというKotlinのパラダイムは破られています。
プラットフォームタイプの表記は、感嘆符が付いたタイプとして定義されています。 たとえば、 String!は、オブジェクトがnull許容であるかどうかを意味します。
3. プラットフォームタイプのヌル可能性チェック
プラットフォームタイプのnull可能性を処理する方法を見てみましょう。 まず、Clientクラスを定義しましょう。
public class Client {
private String name;
public Client() {
}
public String getName() {
return name;
}
}
クライアントの名前はnull可能です
@Test
fun givenNullable_whenCall_thenFail() {
val client = Client()
assertFailsWith(NullPointerException::class) {
client.name.length
}
}
まず、nameがnull許容であることを警告するコンパイルエラーはありません。 さらに、テストは正常に実行されます。 フィールドnameがnullに等しいため、NullPointerExceptionがスローされます。
デフォルトでは、Kotlinはプラットフォームタイプをnull許容ではないものとして扱います。 ただし、null許容参照型を定義することでこれを変更できます。
@Test
fun givenNullable_whenCall_thenNotFail() {
val client = Client()
val name: String? = client.name
assertThat(name?.length).isNull()
}
その後、nameオブジェクトの安全な呼び出しのおかげで、そのnullabilityを処理しました。
4. NullabilityCheckをサポートするJavaアノテーション
ここで、Javaのオブジェクトのnull可能性をKotlinに提供する方法を見てみましょう。 null可能性情報を提供するJavaタイプは、プラットフォームタイプではありません。 したがって、安全な呼び出しなしでnull許容オブジェクトにアクセスすると、Kotlinのコンパイラはエラーをスローします。
サポートされている注釈のリストは次のとおりです。
- JetBrains – org.jetbrains.annotationsパッケージの@Nullableおよび@NotNull
- JSpecify – org.jspecify.nullness
- Android – com.android.annotationsおよびandroid.support.annotations
- JSR-305 – javax.annotation
- FindBugs – edu.umd.cs.findbugs.annotations
- Eclipse – org.eclipse.jdt.annotation
- ロンボク– lombok.NonNull
- RxJava 3 – io.reactivex.rxjava3.annotations
さらに、クラス JvmAnnotationNames には、サポートされている注釈の完全なリストが含まれています。 さらに、どの注釈を報告する必要があり、コンパイラーがどのように報告するかを指定できます。 コンパイラオプション -Xnullability-annotations = @
レベルは次のいずれかになります。
- ignore –null可能性の不一致を無視します
- warn –null可能性の不一致について警告します
- strict –null可能性の不一致でエラーをスローします
次に、公開されたゲッターに @Nullable アノテーションを追加して、クライアントクラスを変更しましょう。
@Nullable
public String getName() {
return name;
}
その後、テストを実行できなくなりますgivenNullable_whenCall_thenFail。コンパイラはエラーメッセージとともに例外をスローします。
Only safe (?.) or non-null asserted (!!.) calls are allowed on a nullable receiver of type String?
アノテーションのおかげで、KotlinのコンパイラはgetNameがnullを返す可能性があることを認識しています。
5. 結論
この短い記事では、Kotlinのプラットフォームタイプについて説明しました。 さらに、プラットフォームタイプのnull可能性を処理する方法を示しました。 最後に、Kotlinでのnull可能性チェックをサポートするアノテーションを確認しました。
いつものように、例のソースコードはGitHubでから入手できます。