2017/11/07

Android: デフォルトで@NonNull扱いにする

JSR 305’s @ParametersAreNonnullByDefault を使うと, @Nullable でアノテートされていないメソッド, 引数, フィールドが @NonNull アノテートされているように解釈され, @NonNull アノテートされているのと同じ振る舞いになります.

プロジェクトによっては, @NonNull を明示することが煩わしく, @Nullable のみを定義することにして, それ以外は @NonNull 扱いとするルールを採用しているところもあるかと思います.
ただ, これではIDEが提供するNull安全のインスペクションメッセージによる恩恵を受けることができず, 実装者が “@Nullableをつけ忘れていた” なんて悲劇を招く可能性もあります.

“Tool, not Rules” ということで, デフォルトの振舞いを @NonNull にしたいときは, @ParametersAreNonnullByDefault が使えます.
このアノテーションはクラス単位でつけることもできますが, 例えば次のようにパッケージ単位でも指定できるため, プロジェクトのデフォルト設定としても役に立ちます.

com.android.myappフォルダに↓のような package-info.java を用意すれば, パッケージ単位で @NonNull アノテーションが有効になります.

// com.android.myapp.package-info.java
@javax.annotation.ParametersAreNonnullByDefault
package com.android.myapp;

JavaからKotlin化する際には @Nullable / @NonNull が定義されていると, とても移行しやすいですのでおすすめです.

以上です.