第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アノテーションを読み取り、正しくオーバーライドしているかチェックするようになったのです。
これでコンパイルの時点でバグが未然に防げたことになります。
以上のように、アノテーションを記述することで、アノテーションを読み取る側に必要な処理を行わせることができます。
アノテーションを適切に使いこなし、より簡単で、より確実な開発を目指しましょう。		

