お詫びと訂正
この記事の公開時点ではorg.springframework.lang
内のNonNull
/Nullable
アノテーションも機能すると記載していましたが、これは誤りでした。
これらのアノテーションを用いた場合、IDE上の補完表記は変化するものの、コンパイル時には警告しか出ない状態でした。
お詫びして訂正します。
前書き
org.jetbrains.annotations
内のNotNull
/Nullable
といったアノテーションを用いることで、Java
のフィールドをKotlin
からKotlin
っぽく扱えるようになります。
同様に利用可能なアノテーションは他にも有りますので、以下をご覧下さい。
- Calling Java from Kotlin - Kotlin Programming Language
- kotlin/JvmAnnotationNames.kt at master · JetBrains/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型)で扱われています。
以下のように、アノテーションをNullable
に変更するとことで、String?
型として扱うこともできます。
- import org.jetbrains.annotations.NotNull;
+ import org.jetbrains.annotations.Nullable;
- @NotNull
+ @Nullable
public String getField() {
補足
POJO的なオブジェクトに対してアノテーションを振る場合は、ゲッターに振った方が良いです。
画像の通り、フィールドに振ってしまうと「初期化しろ」と怒られるためです。
意義
Java
プロジェクトにKotlin
を導入したり、Kotlin
からJava
のフレームワークを使う場合、しばしば「値無しコンストラクタでオブジェクト初期化 -> セッターで各値を注入」的な挙動をされる場合が有ります。
このような場合、対象オブジェクトをKotlin
で書こうとすると結構な工夫をする必要があり、「これKotlin
で書く意味有るんだっけ」となれます。
既存のJava
オブジェクトがあり、それを一々全て書き換える必要があるなら、労力もバカになりません。
初めからData
クラスにマッピングできるようにユーティリティを作るというのも手ですが、書き換え以上に初期コストは掛かるでしょう。
そんなことをする位なら、ゲッターにアノテーションを振るだけで済ませた方がスマートなんじゃないかなと思います(無論何が何でもフルKotlin
にしたいという場合は別ですが、実現できる挙動が同等であれば別にJava
で書いていいんじゃないかとは思います)。