【コラム】

Java API、使ってますか?

16 アノテーションを使ってバグ退治 - JSR 305

16/60

JSR 305: Annotations for Software Defect Detection

前回に引き続き、今回も将来的にJava SEに取り込まれる可能性のあるアノテーション関連のJSRを取り上げたいと思う。今回紹介するのは、Javaプログラムのバグ退治をサポートするアノテーションの標準セットとなる「JSR 305: Annotations for Software Defect Detection」だ。

現在、Javaプログラムのバグを探すにはFindBugsIntelliJなどに代表されるバグ検証ツールを利用するのが一般的である。これらのツールを利用することで、バグの原因となりやすいコードパターンや無意味な処理を行っている箇所などを開発時に容易に発見することができる。

JSR 305では、こういったバグ検証をサポートするアノテーションの標準セットを提供する。たとえばNullチェックを行うアノテーションや、メソッドの戻り値の検証、並行性の誤りチェックなどを行うアノテーションなどの導入が検討されている。

FindBugsやIntelliJでは、現時点ですでにこのようなアノテーションの数々が用意されており、各ツールによるバグの検証に利用することができる。ただしそれらは各々独自に開発されたものであるため、他ツールとの互換性は考慮されていない。JSR-305ではこれらのアノテーションの仕様を標準化することで、各ツール間の互換性を確保する狙いがある。また、現時点では検証コードを挿入することが困難な部分も、新たなアノテーションによって検証が可能になるという効果も期待されている。

JSR 305で用意されるアノテーション

JSR 305のスペックリードはFindBugsプロジェクトの創立者であるWilliam Pugh氏が務め、エキスパートグループにはIntelliJをリリースしているJetBrainsなどが参加している。この面子を見てもわかるように、JSR 305の仕様はFindBugsやIntelliJの影響を強く受けており、まずはこれらのツールで提供されているアノテーションと同等のものが用意される予定である。

JSR 305の仕様に間するディスカッションは、Google Groups内にあるJSR 305グループで行われている。それによれば、現在のところ下記のようなアノテーションの採用が検討されている。

  • @Nonnull: nullを許容しない
  • @Nullable: nullを許容する
  • @CheckForNull: nullになる可能性を考慮してチェックを促す
  • @Nonnegative: 負数を許容しない
  • @Signed: 符合付き数値のみ許可
  • @CheckForNegative: 負数になる可能性を考慮してチェックを促す
  • @Positive: 正数のみ許可
  • @CheckForNonpositive: 正数で無い可能性を考慮してチェックを促す
  • @CheckReturnValue: メソッドの戻り値をチェック
  • @Nls: 自然言語の文字列のみ許可
  • @NonNls: 自然言語でない文字列のみ許可
  • @Syntax: シンタックスを指定(たとえば"JavaScript"など)
  • @Pattern: 文字列のパターンを指定
  • @RegEx: 正規表現の文字列のみ許可
  • @ResultSetType: ResultSetのタイプを示す値のみ許可
  • @ResultSetConcurrency: ResultSetの並行処理モードを示す値のみ許可
  • @ResultSetHoldability: ResultSetの保持機能モードを示す値のみ許可
  • @InjectionAnnotation: あるアノテーションがリソースインジェクションのためのものであることを示す

実際にどのようなアノテーションがどのような実装で採用されるのかは現在も活発に議論されている最中であり、ここで挙げたものがすべてというわけでもない。上記以外の候補としては、たとえば並列プログラミングをサポートする@GuardedBy、@ThreadSafe、@NotThreadSafe、@Immutableなどがある。これらFindBugsでサポートされているアノテーションの一部だ。あるアノテーションが単体テスト用のものであることを示す、@TestAnnotationアノテーションなどの提案もある。そのほかにも独自のアイデアがある場合には、グループに参加して提案してみるといいだろう。

FingBugsのアノテーションを試す

それでは、実際にJSR 308で用意されるアノテーションを使ってどのようなことができるのかを知るために、同JSRのモデルとなっているFindBugsで提供されるアノテーションを試してみよう。

FindBugsはここからダウンロードできる。配布ファイルのlibディレクトリにあるannotation.jarに、FindBugsで提供されるアノテーションが含まれている。どのようなアノテーションが使えるかはAPIドキュメントを参照のこと。ここでは、JSR 305にも同様の機能のものが採用された@NonNull、@Nullable、@CheckForNullの3つを使ってリスト1のようなプログラムを作ってみた。

リスト1 FindBugsAnnotationSample.java - FingBugsのnullチェック用アノテーションの使用例

package samples;

import edu.umd.cs.findbugs.annotations.NonNull;
import edu.umd.cs.findbugs.annotations.Nullable;
import edu.umd.cs.findbugs.annotations.CheckForNull;

public class FindBugsAnnotationSample {
    @NonNull
    public static String nonNullMethod() {
        return null;
    }

    @CheckForNull
    public static String checkForNullMethod() {
        return null;
    }

    @Nullable 
    public static String nullableMethod() {
        return null;
    }

    public static void main(String[] args) {   
        String str;
        str = nonNullMethod().trim();
        System.out.println(str);
        str = checkForNullMethod().trim();
        System.out.println(str);
        str = nullableMethod().trim();
        System.out.println(str);
    }
}

これをコンパイルして、図1のようにJARファイルにまとめる。そしてFindBugsを用いてバグ検証してみると、図2のように2つのバグが報告される。

サンプルプログラムをJARファイルにまとめる

FindBugsAnnotationSample.javaの検証結果

1つ目はnonNullMethod()メソッドがnullを返そうとしていることの警告で、@NonNullアノテーションが効いていることがわかる。2つ目はcheckForNullMethod()メソッドから返されたオブジェクトに対してtrim()を実行しようとしたことに対する警告で、これは@CheckForNullによってnullチェックを促されていることによる。nullableMethod()メソッドは@Nullableなのでとくに警告は受けていない。バグ検証のためのアノテーションの役割がわかっていただけただろうか。

ちなみに、Google CodeにもJSR 305用のプロジェクトページが用意されており、そこではSubversionリポジトリにおいて参照実装のソースコードが公開されている。

スペックリードのWilliam Pugh氏によれば、今後は夏過ぎごろまでに仕様に関する議論をいったんまとめ、叩き台となる実装の作成を行う予定だという。JSR 305は今のところJava SE 7の候補には入っていないが、エキスパートグループは最終的にこのJSRがJava SEに統合されることを目指している。その場合、前回紹介したJSR 308との互換性なども気になるところだ。

16/60

インデックス

連載目次
第60回 どうなる? 今後のJavaプラットフォーム(Java SE編)
第59回 どうなる? 今後のJavaプラットフォーム(Java EE編)
第58回 Java SE 7の要注目機能"クロージャ"はどうなるのか その6
第57回 Java SE 7の要注目機能"クロージャ"はどうなるのか その5
第56回 Java SE 7の要注目機能"クロージャ"はどうなるのか その4
第55回 Java SE 7の要注目機能"クロージャ"はどうなるのか その3
第54回 Java SE 7の要注目機能"クロージャ"はどうなるのか その2
第53回 Java SE 7の要注目機能"クロージャ"はどうなるのか
第52回 Early Draftが公開されたJSF 2.0
第51回 EJBから独立したJava Persistence 2.0
第50回 モバイルJavaの新しい潮流となるか - MSA 2.0のドラフト公開
第49回 やっぱり基本はServlet - Servlet 3.0のEarly Draftを読む
第48回 JOGLで3Dプログラミング その4
第47回 JOGLで3Dプログラミング その3
第46回 JOGLで3Dプログラミング その2
第45回 JOGLで3Dプログラミング
第44回 JARファイルを効率的にネットワーク転送するためのPack200形式
第43回 Early Draftで把握するEJB 3.1の新機能
第42回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その2
第41回 次世代の携帯端末向けJava仕様"MIDP 3.0"はどうなるか その1
第40回 リソースアダプタによる接続の仕組み
第39回 JCAを利用したシステム間接続
第38回 Java EEと外部システムの接続性を支えるJCAがバージョンアップ
第37回 Javaのモジュラリティ強化を担う"スーパーパッケージ"とは
第36回 JSR 308対応のコンパイラを試す
第35回 公開されたJSR 308のEarly Draftを検証する
第34回 スクリプト言語とJavaを結びつけるJSR 223
第33回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その2
第32回 Java EE環境に統一されたコンポーネントモデルを提供するJSR 299 その1
第31回 Javaの文法がそのまま使えるスクリプト言語"BeanShell"
第30回 Javaアプリケーションにオブジェクトのキャッシュ機構を提供するJCache API
第29回 Javaアプリケーションからのリソース管理を可能にするJSR 284
第28回 XMLデータソースへの問い合わせはJSR 225で
第27回 Portlet Specification 2.0をもっと手軽に利用する
第26回 次期Javaポートレット仕様となるJSR 286
第25回 JSFとポートレットをつなげるJSR 301
第24回 Webサービス向けのポートレット仕様「WSRP」
第23回 高い相互運用性を実現するポートレットAPI - JSR 168
第22回 Java EE環境でタスクのスケジューリングを可能にするJSR 236
第21回 Java EE環境でのスレッドプログラミングを可能にするJSR 237
第20回 音声認識/合成のためのAPI - Java Speech APIとJSR 113
第19回 JSR 291でJavaプラットフォームにダイナミックコンポーネントモデルを導入
第18回 JAX-RSで簡単RESTful - JSR 311
第17回 待望のServlet 3.0がJSRに登場 - JSR 315
第16回 アノテーションを使ってバグ退治 - JSR 305
第15回 アノテーションをさらに広い範囲で利用可能にするJSR 308
第14回 Webアプリケーション開発の要となるか - JSF 2.0がJSRに登場
第13回 Webサービス経由でのJMX Agentへの接続を可能にするJSR 262
第12回 Javaアプリケーションのモジュール化をサポートするJava Module System
第11回 "NIO.2"がやってきた - JSR 203: More New I/O APIs for the Java Platform
第10回 JSR 295: Beans Bindingの参照実装を試す
第9回 けっこう便利! 単位を扱うAPI -- JSR 275: Units Specification
第8回 アノテーションでバリデーション - JSR 303: Bean Validator
第7回 Swing開発の救世主となるか - Swing Application Framework
第6回 JavaBeansのプロパティを同期させるバインディングAPI
第5回 誰よりも早く"Java SE 7"を睨む
第4回 日時情報の取り扱いを改善する JSR 310: Date and Time API
第3回 古いAPIも進化している!? - JSR 919: JavaMail 1.4
第2回 JSR 1 リアルタイムJava仕様
第1回 JCPによって進められるJava関連技術の標準化

もっと見る

提供:マイナビ

会員登録はこちら

大学・大学院・短大・専門学生向けの就職情報サイト「マイナビ2010」「マイナビ2009」に今すぐ登録しよう!  大手企業からベンチャー企業までの約13,000社の企業情報を公開、エントリーが可能です。2010年卒予定の方は「マイナビ2010」に、2009年卒予定の方は「マイナビ2009」に登録してください。

毎日コミュニケーションズはプライバシーマークを取得しています。



人気記事

一覧

イチオシ記事

新着記事