BT

最新技術を追い求めるデベロッパのための情報コミュニティ

寄稿

Topics

地域を選ぶ

InfoQ ホームページ ニュース JSR-305: ソフトウェア欠陥検出用アノテーション

JSR-305: ソフトウェア欠陥検出用アノテーション

FindBugs、IntelliJ、CheckstyleおよびPMDなどの静的解析ツールは、Java開発で広く使用されている。これらのツールは高度化されているが、処理しにくい共通の問題を抱えている。それは、通常、NULLの値を許容する場合、または数値が負にならないことが予想される場合など、APIでの暗黙の設計意思決定である。Javaでは、APIが高度であれば、これらの設計詳細がJavaDocに取り込まれるが、解析ツールには簡単にアクセスできないので、欠落したり、誤検出される可能性がある。

この問題に対処するために、多くの静的解析ツール開発者がアノーテーションを使用して設計詳細を定義することを検討している。たとえば、FindBugsおよびIntelliJは、メソッドがNULLを戻す可能性があることを示すために独自のアノーテーションを定義している。この2つのツールで使用されるアノーテーションは若干異なっているため、標準化の問題がある。FindBugsのクリエーター、Bill Pugh が推進するJSR-305は、解析ツールで使用可能なアノーテーションの標準セットと、開発者の必要に応じて追加のアノーテーションを追加できる機構の両方を作成することを目指している。現在の提案には、NULLに対するアノーテーション、符号、言語、特にスレッディングが含まれている。

Bill Pughは、Googleで行われた技術的な討論(リンク)の中で、多数の具体的な例を挙げてNULLの説明から始めた。目的は、メソッドで、パラメータ、常に非NULLとなる必要のある戻り値とフィールド、引数がNULLを受け入れる必要のある文を定義できるようにすることである。Pughのソリューションでは、次の3つのアノーテーションを使用する。
@Nonnull - オブジェクトが初期化された後、非NULLになる必要があると解釈される。
@NullFeasible - この値は常にNULLになる可能性がある。ツールにより、先頭にNULLチェックが付いていない修飾参照にフラグを付ける必要がある。戻り値をNullFeasibleとしてマーク設定すると、可能なNULLパラメータがコード全体に波及するため、他の多数のコード変更が必要となる場合がある。
@UnknownNullness - アノーテーションなしと同義であるが、デフォルトで継承されたアノーテーションをサポートする必要がある。

その他、@Nonnegative、@Signed、@CheckForNegative、@Positiveおよび@CheckForNonpositiveなど、数値について許可された符号を示すために使用される符合のアノーテーション、文字列が特定の言語(SQL、regex など)で記述されていることを示すための言語のアノーテーション、特定のスレッド(またはスレッド グループ)から呼び出す必要がある(または呼び出してはいけない)メソッドを示すスレッディングのアノーテーションが提案に含まれる見込みである。GoogleのJSR-305に関するディスカッショングループ(リンク)で、Pughは次のように述べた。

「特定の状況下で、特定のスレッドから呼び出す必要のある命令、または呼び出してはならない命令があります。代表的な例がAWT/Swingスレッディングの問題で、JavaでのGUI開発に伴う中心的な課題となっています。特定のAWT/Swing命令は、*常に* イベント スレッドで作成する必要があります。そうでないと、イベントスレッドで命令が実行されるまで時間がかかり過ぎるため、ユーザはアプリケーションの処理を遅いと感じる(Swingが遅いと評される主な理由の1つ)など、種々の些細な問題に煩わされる結果になります。こうした問題に対処するために、常に命令を呼び出す必要がある、または呼び出してはいけないスレッドまたはスレッド グループを指定するために使用できる@ThreadRestrictionsの作成を提案します。

さらに開発者の負担を軽減するため、またSwing/AWTの問題がすべてのJavaデスクトップ開発に影響を及ぼしていることからも、@EventThreadOnly @NeverEventThreadアノーテーションの作成を提案します。」 

JSR-305は、アノーテーションの基礎を定義するとともに、開発者がJava型システムに独自の属性を定義できるようにする型修飾子のメタアノーテーションを提供することを目指している。この目的の重要な動機は、Version 5以前のJavaに列挙型がないため、列挙型が設計上望ましい選択であるパブリック定数を伴う整数および文字列を使用するJava APIが多数発生する結果となったことである。したがって、JDBC createStatementのようなメソッドは3つのintパラメータ(resultSetType、resultSetConcurrency、resultSetHoldability)を取り、開発者が使用するためのTYPE_FORWARD_ONLY、CONCUR_READ_ONLY、HOLD_CURSOR_OVER_COMMITなどの一群の最終的な静的パブリックint定数が提示される。適切な整数を正しい順序でメソッド呼び出しに入れた場合、3つの整数だけであるため、コンパイラから通知されることはない。JSRは、型修飾子のためのメタアノーテーションを定義することにより、開発者が必要な型修飾子を追加できるようにする機構を提供する。前述の非NULLの例に戻ると、これは次のように表示される。

@Documented
@TypeQualifier
@Retention(RetentionPolicy.RUNTIME)
public @interface Nonnull {

When when() default When.ALWAYS;
ElementType[] defaultFor() default{};

}

上記で、
@はJavaDocに入れる必要があるか、ないかを示す。
@TypeQualifier は型修飾子であることを示す。
@Retention はリフレクション経由で利用可能かどうか、および位置特定情報を提供するために引数を使用できる場合を示す。

このJSR-305は、Java 7の一部として提供される予定であるが、言語を変更する必要はなく、エキスパート グループは Java 5以降のサポートを目指している。エキスパート グループのメンバーには、Sun、Google、JetBrainsおよびDoug Leaが含まれている。

原文はこちらです:   http://www.infoq.com/news/2008/06/jsr-305-update

この記事に星をつける

おすすめ度
スタイル

BT