The King's Museum

ソフトウェアエンジニアのブログ。

【Effective Java】項目36:常に Override アノテーションを利用する

@Override アノテーション

Java 1.5 でいくつかのアノテーションがライブラリに追加されましたが、最も重要なのは @Override アノテーションです。 @Override アノテーションスーパークラスメソッドをオーバーライドしていることを示します。

public class Example {
    @Override // => Object.equals() をオーバーライドしていることを示す
    public boolean equals(Object o) {
        ... 省略 ...
    }
}

@Override アノテーションが付けられているのに、実際にはオーバーライドしていない場合にはコンパイルエラーとなります。

たとえば、equals() をオーバーライドしようとしているのに、引数を間違って Object 以外にしてしまうなどの場合に有用です。

public class Example {
   @Override // => 引数を間違えてオーバーライドしていないので、コンパイルエラーになる
   public boolean equals(Example e) {
        ... 省略 ...
   }
}

また、逆にオーバーライドするつもりがないのに意図せずオーバーライドしてしまう場合には IDE が警告を出してくれる場合があります。

public class Parent {
   private String name;
   public String getName() {
       return name;
   }
}

public class Child extends Parent {
   private String name;
   public String getName() { // => 意図せぬ Override?意図するなら @Override をつけるべき
       return name;
   }
}

例外として抽象クラスの抽象メソッドをオーバーライドする場合や、インタフェースの宣言を実装する場合には @Override をつける必要はありません。

もちろん、つけても害はありませんので、意図を明確にするために @Override をつける方がよい場合が多いです。

(c) The King's Museum