型アノテーションを使用したChecker Frameworkは、複数のチェッカーから構成されています。その中でも最も代表的なチェッカーであるNullness Checkerを、前回、紹介しました。

 しかし、それ以外にも有用なチェッカーが提供されています。そこで、今回は使えるチェッカーを紹介していきます。今回、紹介するチェッカーを以下に示します。

  • Initialization Checker
  • Interning Checker
  • Regex Checker

 それぞれのチェッカーは独立しているので、必要なチェッカーだけを使用できます。解説も別個になっていますので、どこから読んでも大丈夫です。

Initialization Checker

 前回のNullness Checkerの解説で、@NonNullなメソッド引数にnullを指定してしまうというサンプルを示しました。リスト1にそのサンプルを再掲します。

リスト1●コンパイルエラーになる例

public @NonNull String sayHelloTo(@NonNull String person) {
    return "Hello, " + person + "!";
}

public void test() {
    Greeting greeting = new Greeting();

    greeting.sayHelloTo(null);
}

 このコードに対し、Nullness Checkerを実行すると以下のようなコンパイルエラーが表示されます。

C:\demo\src\Greeting.java:14: エラー: [argument.type.incompatible] incompatible types in argument.
    greeting.sayHelloTo(null);
  found   : null
  required: @Initialized @NonNull String
エラー1個

 着目していただきたいのが、requiredの項です。ここには、sayHelloToメソッドの引数personの対して、要求されている型を示しています。@NonNull Stringはいいのですが、その前に指定していないはずの@Initialziedというアノテーションが記述されています。

 このアノテーションこそがInitialization Checkerで定義しているアノテーションです。

 Initialziation Checkerはオブジェクトの初期化に関するチェッカーです。オブジェクトの初期化はnullとの関連が深いため、Nullness Checkerと一緒に実行されます。逆にいうと、Initialziation Checkerだけを単独では実行できません。

 また、Nullness Checkerでは@NonNullアノテーションがデフォルトになっていましたが、Initialization Checkerでは@Initializedアノテーションがデフォルトになっています。このため、リスト1のsayHelloToメソッドの引数の型が@Initialized @NonNull Stringとなっていたのです。