読者です 読者をやめる 読者になる 読者になる

技術開発日記

技術やら日々思ったことを綴ってます。

タイプアノテーション

今までクラスやメソッドに対して宣言できたアノテーションが、Java8から変数の型やジェネリックスの型に対してもアノテーションを定義することができるようになりました。
ただ、注意点として、あくまて宣言できるようになっただけでデフォルトでJavaに入っているわけではないです。

では、どうやって使うのかというと
そこは、Checker Frameworkというライブリを使うことになるのでここから jarをダウンロードしてパスを通せば使えます。
(自分はてっきりJavaでデフォルトで入っていると思っていたので、ずっとコンパイルエラーで悩んでた。。)

もちろんMavenからもOKです。

Mavenを使用する場合

<dependency>
    <groupId>org.checkerframework</groupId>
    <artifactId>checker-qual</artifactId>
    <version>1.8.11</version>
</dependency>

ちなみにEclipseプラグインも用意されているので、合わせて入れておくと便利です。

手順

1. Help > Install New Software...
2. Addを選択
3. 下記を入力
 Name: Checker Framework
 Location: http://types.cs.washington.edu/checker-framework/eclipse
4. ライセンスの同意
5. 再起動

@NonNull

おそらくタイプアノテーションでよく例にされるのはこの@NonNullではないかと思います。
@NonNullは宣言することによってコンパイル時にNullPointerExceptionを発見できるアノテーションです。
今回は簡単な例ですが、いろんなクラスが複雑に絡み合っている場合にはかなり使えるかもしれない。
また、メリットとして事前にヌルポが発覚できる以外にも人だけが理解できるJavadocやコメントからコードに移すことで、Javadoc、コメントがシンプルになるというメリットもあります。

サンプルコード

public static void main(String[] args) {
    @NonNull String str = getSomething(); // 変数の型にNonNullアノテーション 
    System.out.println(str.length()); // NullPointerException
}

static String getSomething() {
    return null;
}

サンプルコード2

public static void main(String[] args) {
    List<@NonNull String> list = new ArrayList<>(); // ジェネリックスの型にNonNullアノテーション
    list.add(null);

    System.out.println(list.get(0).length()); // NullPointerException
}


@NonNull以外にもいろんなアノテーションの種類があったりしますが、かなりの量があるので一部だけ記載。
詳しくはChecker Frameworkのマニュアル

正規表現の形式が正しいか

@Regex String str = "(Java|JDK) [7,8]"
</code></pre>

オブジェクトを変更したか

@ReadOnly String str = "test";

まとめ

簡単に紹介しましたが、個人的にはメリットよりデメリットが多い気がしているこのタイプアノテーションです。
コンパイル時点でいろいろチェックできるのはいいですが、それ以上にソースが結構散らかる(キャストとかジェネリックスにアノテーションって。。)し、読みづらい。
あと、正直NonNull以外のアノテーションを見てみるも、量が多すぎる上に、毎回アノテーションをググって実装するのはあまりにも非効率な気がする。
その上おそらく自分しか理解できないであろうアノテーションをいろんなところにまき散らかすのはチームで開発する上では結構ネックになるのではないかと思う。

なので、紹介しておいてあれですが、自分はこのタイプアノテーションに関しては使いません。

参考
http://orablogs-jp.blogspot.jp/2014/04/java-8s-new-type-annotations.html
http://types.cs.washington.edu/checker-framework/current/checker-framework-manual.html