LoginSignup
3
3

More than 3 years have passed since last update.

【Kotlin】NotNull(NonNull)/NullableアノテーションでJavaのフィールドをKotlinからNull安全に扱う【Java】

Last updated at Posted at 2019-10-24

お詫びと訂正

この記事の公開時点ではorg.springframework.lang内のNonNull/Nullableアノテーションも機能すると記載していましたが、これは誤りでした。
これらのアノテーションを用いた場合、IDE上の補完表記は変化するものの、コンパイル時には警告しか出ない状態でした。

お詫びして訂正します。

前書き

org.jetbrains.annotations内のNotNull/Nullableといったアノテーションを用いることで、JavaのフィールドをKotlinからKotlinっぽく扱えるようになります。

同様に利用可能なアノテーションは他にも有りますので、以下をご覧下さい。

やり方

以下のように付与するだけで大丈夫です。

import org.jetbrains.annotations.NotNull;

public class Sample {
    private String field;

    @NotNull
    public String getField() {
        return field;
    }

    public void setField(String field) {
        this.field = field;
    }
}

付与するとどうなるか

付与前は以下の画像のように、Kotlin上ではString!型(Platform型)で扱われています。
スクリーンショット 2019-10-24 21.30.17.png

付与後はString型で扱われていることが分かります。
スクリーンショット 2019-10-24 21.31.27.png

以下のように、アノテーションをNullableに変更するとことで、String?型として扱うこともできます。

Nullableへの変更
- import org.jetbrains.annotations.NotNull;
+ import org.jetbrains.annotations.Nullable;
- @NotNull
+ @Nullable
public String getField() {

スクリーンショット 2019-10-24 21.35.39.png

補足

POJO的なオブジェクトに対してアノテーションを振る場合は、ゲッターに振った方が良いです。
画像の通り、フィールドに振ってしまうと「初期化しろ」と怒られるためです。
スクリーンショット 2019-10-24 22.00.55.png

意義

JavaプロジェクトにKotlinを導入したり、KotlinからJavaのフレームワークを使う場合、しばしば「値無しコンストラクタでオブジェクト初期化 -> セッターで各値を注入」的な挙動をされる場合が有ります。

このような場合、対象オブジェクトをKotlinで書こうとすると結構な工夫をする必要があり、「これKotlinで書く意味有るんだっけ」となれます。
既存のJavaオブジェクトがあり、それを一々全て書き換える必要があるなら、労力もバカになりません。
初めからDataクラスにマッピングできるようにユーティリティを作るというのも手ですが、書き換え以上に初期コストは掛かるでしょう。

そんなことをする位なら、ゲッターにアノテーションを振るだけで済ませた方がスマートなんじゃないかなと思います(無論何が何でもフルKotlinにしたいという場合は別ですが、実現できる挙動が同等であれば別にJavaで書いていいんじゃないかとは思います)。

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3