JSpecifyについて
AndroidXのReleaseNoteで This library now uses JSpecify nullness annotations
という記述があり、 JSpecify
を知らなかったので簡単に調べてみました。
JSpecifyとは
基本的に以下を見てもらえると良いかなと。
Googleなどの複数の企業が参加していて、JVM言語で使用する共通のアノテーションを定義して相互運用の向上を目的にしています。今はNullに関するアノテーションが焦点を当てています。
上記のドキュメントにも記載されていますが、Nullに関するアノテーションはこちらのStackoverflowにある通りたくさんあります。これをなんとかしようとしてる感じですね。org.jetbrains.annotations.NotNull
だったり、 androidx.annotation.NonNull
だったり、他にも色々ありますね。
使ってみる
以下のドキュメントにあります。
まず使うにはGradleで追加します。
implementation("org.jspecify:jspecify:1.0.0")
@NonNull と @Nullable
Nullにならない箇所では @NonNull
をつけ、Nullの可能性がある箇所には@Nullable
を使うだけです。おそらく知ってる人が多いのかなと。
import org.jspecify.annotations.NonNull;
import org.jspecify.annotations.Nullable;
public class Sample {
public @NonNull String hoge() {
return "hoge";
}
public @Nullable String foo() {
return null;
}
}
@NullMarked と @NullUnmarked
こちらは、classなどに付与して全体を定義する感じになります。
@NullMarked
public class Sample {
public String hoge() {
return "hoge";
}
public @Nullable String foo() {
return null;
}
@NullUnmarked
public static class Sample2 {
public String piyo() {
return null;
}
}
}
@NullMarked
をつけるとそのスコープのものは基本NonNullとして扱うようになります。 @NullUnmarked
をつけると @NullMarked
の指定を解除する感じなります。
簡単にはこんな感じになります。他の細かいものはドキュメントを見てもらえれば。
AndroidXについて
今年くらいからAndroidXライブラリで JSpecify
が使われるようになっているようです。こちらのIssueTrackerで確認できます。
基本的にAndroidアプリ開発者の人はKotlinを使ってる方が多いと思いますし、Kotlinは JSpecify
のアノテーションを認識できるので、そこまで気にする必要はないかなと思います。