Java 1.5 Tiger で、メソッドなどに不可情報を与える仕組みとして Annotation が導入されました。 デフォルトで使用できる標準アノテーションとしては下記のものが定義されています。
アノテーション型を使用するには、クラスと同様に import
が必要ですが、上記の標準アノテーションは java.lang
パッケージに属しているため、import
せずに使用することができます。
独自のカスタムアノテーションを作成することもできます。
あるメソッドに @Override
を付加することで、スーパークラスのメソッドをオーバライドしているという意思をコンパイラに伝えます。
スペルミスなどでオーバライドできていないなどのミスを、コンパイル時に防ぐことができます。
@Override
public String toString() { ... } // OK
@Override
public String toStrin() { ... } // コンパイルエラー(オーバライド対象のメソッドがない)
Override
アノテーションは、オーバライドされるスーパークラス側のメソッドには記述しません。
Java では、オーバライドされることを前提としたメソッドは abstract
キーワードで示すことができます。
Deprecated
アノテーションをメソッドやフィールドに付加すると、それらの使用が非推奨であることをコンパイラに知らせることができます。
Javadoc にも @deprecated
タグがありますが、こちらは主にドキュメントの記述に使われる印です。
一方で Deprecated
アノテーションは、コンパイル時に非推奨要素の使用を使っているかを検出して警告します。
Deprecated
アノテーションを使用するケースでは、同時に Javadoc の @deprecated
タグを使い、代替手段を説明するようにしましょう。
下記は String
クラスの非推奨コンストラクタの例です。
/**
* Converts the byte array to a string, setting the high byte of every
* {@code char} to the specified value.
* ...
* @deprecated Use {@link #String(byte[])} or {@link #String(byte[], String)} instead.
*/
@Deprecated
public String(byte[] data, int high) { ... }
SuppressWarnings
アノテーションを付加すると、コンパイラによる警告を抑制することができます。
下記のメソッド useDeprecatedMethod
は、Deprecated なメソッドを呼び出しているので、デフォルトではコンパイラによる警告が発生しますが、SuppressWarnings
アノテーションによりこの警告を抑制しています。
@SuppressWarnings("deprecation")
private void useDeprecatedMethod() {
obj.deprecatedMethod();
}
Checkstyle や PMD などの静的解析ツールによる警告を抑制することもできるようになっています。 下記は、PMD による警告の一部を抑制する例です。
@SuppressWarnings("PMD.UnusedLocalVariable")
private void hoge() {
int unusedVar = 1;
...
}
基本的にはコンパイラ警告を抑制するべきではありませんが、何らかの都合(プロジェクト内の政治的理由など)で、まっとうな理由がある場合は抑制してもよいでしょう。 それにより、本当に修正したほうがよい箇所の警告に気付きやすくなります。 警告を抑制した場合は、なぜ抑制する必要があったのかをコメントで記述しておきましょう。