タイプアノテーション

これまでアノテーションはクラスやメソッドの宣言に対してのみ付与することが可能だったが、Java 8からは変数の型やジェネリクスの型パラメータに対しても付与することができるようになった。この機能は「タイプアノテーション」と呼ばれる。

タイプアノテーションの利用例としてはChecker Frameworkがある。これはコードの様々な個所にアノテーションを付与しておくことでコンパイラだけでは不可能な高度な型チェックを行うことができるというものだ(コマンドラインからの実行に加え、EclipseやIntelliJ用のプラグインも用意されている)。

例えば以下のコードはgetObject()メソッドが常にnullを返すため、実行すると最後の行でNullPointerExceptionが発生する。

Object getObject() {
  return null;
}

@NotNull Object obj = getObject();
System.out.println(obj.toString()); // ここでNullPointerExceptionが発生する

しかし、変数objに@NotNullアノテーションを付与しておくことで、Checker Frameworkによって事前にエラーを検出することができる。

このようにタイプアノテーションを使用すると変数やジェネリクスの型パラメータに追加の属性を付与することができるため、今後はChecker Frameworkのようにこれを活用した静的解析ツールやフレームワークが登場してくるのでないだろうか。