

List を返すメソッドにおいて null を返さないことを保証したいと考えています。 実装上は null ではなく
Collections.emptyList() を返すだけですが、null を返さないことをアノテーションで表現することは可能でしょうか。

IDE との何らかの連携があるとより良いのですが、自分の観測範囲ではわかりませんでした。


CC BY-SA 3.0
2014-12-17T06:46:01.747
1880
2014-12-19T02:20:59.003
2014-12-18T05:06:08.353
3371
2939
question
java annotations
戻り値が NotNull であることをアノテーションで表現できますか？


[JSR-305](https://jcp.org/en/jsr/detail?id=305)のライブラリをプロジェクトに追加して、`@javax.annotation.Nonnull`とのアノテーションが下記通り使用できます：

[code]

    @Nonnull
    public List<?> getList() {
        // ...
    }
    
[/code]

JSR-305のライブラリは[Maven中央レポジトリからダウンロード](http://repo2.maven.org/maven2/com/google/code/findbugs/jsr305/)できます。

Netbeans、EclipseやIntelliJの最近のバージョンはJSR-305のアノテーションをサポートして、違反警告を出します。


CC BY-SA 3.0
2014-12-17T07:17:35.800
1886
2014-12-17T07:58:34.960
2014-12-17T07:58:34.960
3371
3371
1880
answer


`null`
を返さないことを保証するアノーテーションをしたいときには、[JSR-305](https://jcp.org/en/jsr/detail?id=305)
を導入するのが一番良いです。 (ここではこのアノテーションを 「`@NonNull`系」と呼ばせてください)

### JSR-305: 導入と記述方法

導入は、 [外部 jar
としてjsr305-X.X.X.jar](http://mvnrepository.com/artifact/com.google.code.findbugs/jsr305/3.0.0)
をクラスパスに追加する、もしくは
[Maven](http://search.maven.org/#search%7Cgav%7C1%7Cg%3A%22com.google.code.findbugs%22%20AND%20a%3A%22jsr305%22)
なら以下のようにします。

[code]

    <dependency>
        <groupId><code class="findbugs"></code></groupId>
        <artifactId>jsr305</artifactId>
        <version>3.0.0</version>
    </dependency>
    
[/code]

そのうえで、メソッドの返り値が `null` ではないことを示すためには、ソースコード上で、アノテーションを以下のように付記します。

[code]

    public @Nonnull static String fold( Iterator<?> iterator) {
       ...
       return nonNullString;    
    }
    
    @Nonnull 
    public static String join( Iterator<?> iterator) {
       ...
       return nonNullString;    
    }
    
[/code]

### @Nonnull 系アノーテーションの生態

`@Nonnull` 系のアノテーションは JDK に付属しておらず、どちらかというと JavaEE の一部という扱いです。どれが標準かはっきりせず、
JSR-305 以外にも `@Nonnull`系アノーテーションが様々なパッケージに存在しています。

  * JSR-305 : `javax.annotation.Nonnull`
  * JSR-303 : `javax.validation.constraints.NotNull`
  * IDEA : `org.jetbrains.annotations.NotNull`
  * Eclipse : `org.eclipse.jdt.annotation.NonNull`
  * Android : `android.support.annotation.NonNull`
  * CheckerFramework: `org.checkerframework.checker.nullness.qual.NonNull`

これらすべて、アノテート目的は同じで、名前が違うぐらいのものです。プロジェクトの構成によって、上記のクラスのどれかを使うことになるでしょう。

### IDE: IntelliJ IDEA でのサポート

IntelliJ IDEA の `null` チェックサポートはおそらく IDE の中でも
[一番歴史が古く](http://blog.jetbrains.com/idea/2006/03/detecting-probably-
npes/)、かなり高機能なので、 開発環境に高度な `null` チェック機能を求めておられるのなら、IDEA は外せません。IDEA
は、歴史的な理由で、独自に `@NotNull` アノテーションを持ってもいます。 IDE がサポートする機能は
`javax.annotation.Nonnull` に対するものより、少し広いので、 IDEAをメインに使用する場合 アノテーションに
`org.jetbrains.annotations.NotNull` を選択するのはアリです。

[code]

    import org.jetbrains.annotations.NotNull;
    ...
    public @NotNull String fold( Iterator<?> iterator) {
       ...
       return it;   
    }
    
[/code]

他に、 IDEA には、メニューの [`Analyze > Infer
Nullity`](https://www.jetbrains.com/idea/help/inferring-nullity.html)
と選択することで、自動で `@Nullable`, `@NotNull` アノテーションをつけてくれる機能があり、便利です。

### IDE: Eclipse でのサポート

Eclipse は基本、 `javax` 及び Eclipse
独自のアノーテーションを認識します。[コンパイラの警告/エラーセッティング](http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.user%2Freference%2Fpreferences%2Fjava%2Fcompiler%2Fref-
preferences-errors-warnings.htm&anchor=null_annotation_names) を変更することで IDE
が反応するようになります。機能的には、最低限をそつなくサポートしている感じで、他の `@Nonnull`
系アノーテーションの導入も容易です。もっと突っ込んだ警告がほしければ、[FindBugs](http://findbugs.sourceforge.net/)
を導入すべきでしょう。

Eclipse の面白い点としては、
[`@NonNullByDefault`](http://help.eclipse.org/luna/index.jsp?topic=%2Forg.eclipse.jdt.doc.isv%2Freference%2Fapi%2Forg%2Feclipse%2Fjdt%2Fannotation%2FNonNullByDefault.html)
というアノーテーションのサポートがあることで、これによりパッケージを対象に、 `@NonNull`
が付いた状態をデフォルトとするといったことができます。強力すぎて警告の数に最初ヒクと思いますが、徹底した管理を求めたいならこれを使うのも良いと思います。

`@NonNullByDefault` は、以下のようにパッケージコメントファイル `package-info.java`
の中のパッケージ宣言に対して付けられます。(※ クラスが書かれたソースコードではありません！）

[code]

    /**
    * @author XXXXX
     */
    @NonNullByDefault
    package jp.domain;
    import org.eclipse.jdt.annotation.NonNullByDefault;
    
[/code]

### IDE: Netbeans でのサポート

Netbeans は `@Nonnull` 系アノーテーションを認識し、ソースコード解析を通して警告を発生することができます。設定ダイアログ `Editor
> Hint` の、 `Null Pointer Dereference` がその警告になります。

不足があれば、 [Firebugs](http://plugins.netbeans.org/plugin/912/findbugs-tm-plugin)
を[ドキュメントに従ってセットアップ](https://netbeans.org/kb/docs/java/code-
inspect.html)していけば、十分な静的解析の環境が整うでしょう。

### 古いプロジェクト向けに

IDE ではありませんですが、[Checker Framework](http://checkerframework.org/) フレームワーク
を使っていると、このように書くこともできます。 ([Eclipse
Plugin](http://types.cs.washington.edu/checker-framework/checker-
plugin/update-site/)もあります)

[code]

    public /*@NonNull*/ String fold( Iterator<?> iterator) {
       ...
       return it;   
    }
    
[/code]

JDK 1.5
で時が止まっているような古いプロジェクトに、ひっそりと導入することができて、幸せになれる人もいるかもしれません。私はこの書き方好きなんですけどね。


CC BY-SA 3.0
2014-12-19T02:14:19.323
2079
2014-12-19T02:20:59.003
2014-12-19T02:20:59.003
4978
4978
1880
answer