株式会社イーヴ

EeBlog(テクニカルブログ)

TOP > EeBlog > 第22回 アノテーション

第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アノテーションを読み取り、正しくオーバーライドしているかチェックするようになったのです。
これでコンパイルの時点でバグが未然に防げたことになります。

以上のように、アノテーションを記述することで、アノテーションを読み取る側に必要な処理を行わせることができます。
アノテーションを適切に使いこなし、より簡単で、より確実な開発を目指しましょう。