型アノテーションの活用例として、前回Checker Frameworkを紹介しました。今回は、Checker Frameworkを使用して、実際にコード解析をしてみましょう。
はじめに紹介するのがnullに対するチェックを行う、Nullness Checkerです。
Nullness Checker
プログラムの障害には様々な種類がありますが、その中でもNullPointerException例外はよく遭遇する障害ではないでしょうか。
NullPointerException例外を防ぐには、nullでないかどうかをこまめにチェックすることや、Optionalクラスを使うようにするなどの対処法があります。Optionalクラスについては、本連載のnullチェックの煩雑さを解決、Java SE 8で導入されたjava.util.Optionalクラスをご参照ください。
とはいうものの、頻繁にnullチェックを記述することや、Optionalクラスを使用することにより、コードが煩雑になりがちです。
そこで、登場するのがChecker FrameworkのNullness Checkerです。Nullness Checkerでは、nullを扱わない場合と、nullになるかもしれない場合を明確に分けるようにします。
nullを扱わない場合、@NonNullアノテーションで修飾します。一方のnullになるかもしれない場合は@Nullableアノテーションで修飾します。この2つのアノテーションがNullness Checkerの最も基本となるアノテーションです。
リスト1はメソッドの返り値に対して@NonNullアノテーションと@Nullableアノテーションを付加した例です。
リスト1●@NonNullアノテーション、@Nullableアノテーションの使用例
public @NonNull String sayHello() {
return "Hello, World!";
}
public @Nullable String sayGoodNight() {
if (Math.random() < 0.5) {
return "Good Night, World!";
} else {
return null;
}
}
sayHelloメソッドはnullを返すことはありません。そのため、@NonNullアノテーションを付加してあります。一方のsayGoodNightメソッドはnullを返すことがあります。そこで、@Nullableメソッドで修飾しています。
もちろん、通常はこんなメソッドを書くことはないはずですが、あくまでも例ということでご了承ください。