第22回 アノテーション
今回のテーマは「アノテーション」です。
いつものように「アノテーションとは何ぞや」というところから始めます。
アノテーションとは、クラスやメソッドなどに記述されるメタデータ(データについてのデータ)のことで、対象となるメソッドなどの前に@をつけて記述します。
Java5で新しく導入された機能の一つで、「注釈」と訳されます。
では、アノテーションの有無がプログラムにどう関わっていくのかを、簡単なプログラムを使って説明していきます。
以下のPlayerクラスはObjectクラスのequalsメソッドをオーバーライドする仕様であるとします。
public class Player { private String name; public Player(String name) { this.name = name; } public String getName() { return name; } public boolean equals(Player player) { return getName().equals(player.getName()); } public int hashCode() { return getName().hashCode(); } }
パッと見た限りでは、正しく実装されているように見えるかもしれません。
しかし、実はこのクラスのequalsメソッドはオーバーライドではなく、オーバーロードなのです。
このような場合、オーバーライドされていないことの発見が遅れ、潜在的なバグとなる可能性があります。
では、ここで上記のプログラムに、標準APIのOverrideアノテーションを追加してみましょう。
public class Player { private String name; public Player(String name) { this.name = name; } public String getName() { return name; } @Override public boolean equals(Player player) { return getName().equals(player.getName()); } @Override public int hashCode() { return getName().hashCode(); } }
Overrideアノテーションを追加したことにより、メソッド自体は正常にも関わらず、このクラスはコンパイル不可能になります。
コンパイラがOverrideアノテーションを読み取り、正しくオーバーライドしているかチェックするようになったのです。
これでコンパイルの時点でバグが未然に防げたことになります。
以上のように、アノテーションを記述することで、アノテーションを読み取る側に必要な処理を行わせることができます。
アノテーションを適切に使いこなし、より簡単で、より確実な開発を目指しましょう。