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可能ですさらに、 getName 方法:

@Test
fun givenNullable_whenCall_thenFail() {
    val client = Client()
    assertFailsWith(NullPointerException::class) {
        client.name.length
    }
}

まず、nameがnull許容であることを警告するコンパイルエラーはありません。 さらに、テストは正常に実行されます。 フィールドnamenullに等しいため、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のコンパイラはgetNamenullを返す可能性があることを認識しています。

5. 結論

この短い記事では、Kotlinのプラットフォームタイプについて説明しました。 さらに、プラットフォームタイプのnull可能性を処理する方法を示しました。 最後に、Kotlinでのnull可能性チェックをサポートするアノテーションを確認しました。

いつものように、例のソースコードはGitHubから入手できます。