型アノテーションを使用した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となっていたのです。