2011-01-27 3 views
15

可能性の重複:
When do you use Java's @Override annotation and why?コードJavaの場合、私は本当に@Overrideなどが必要ですか?

私たちは上書きしたいコードの前に@Overrideを追加する機能があるのだろうか。私はそれをして、そしてそれなしでやりました。すべてがうまくいっているようでした(少なくとも私のために)。

+8

コンパイル時のチェックがずっと面倒です。重複:http://stackoverflow.com/questions/94361/when-do-you-use-javas-override-annotation-and-why – birryree

+1

DelphiからJavaに切り替えたときに私はとても憤慨しました。私は '仮想'これ以上... @オーバーライドは一歩前です。最近ほとんどのIDEには自動オーバーライドがあるので、手で書くことはめったにありませんが、ふわふわしたJavaスタイルに貢献します:) – bestsss

+0

@bestsss - 誰もあなたに@Overrideを使用させません。しかし、あなたが>> >><<書くコードからそれを剥がしてはいけませんか? –

答えて

27

ではありませんが、強くお勧めします。それはあなたが足で自分を撃つのを防ぎます。それは、あなたが別のものを上書きすると考えられる関数を書くときに、あなたが何かを間違って綴ったとあなたが完全に予期せぬ動作をする場合を防ぐのに役立ちます。

2

一貫性の管理に役立つので、お勧めします。誰かがスーパークラスメソッドの名前を変更したとします(それに応じてクラス内で名前の変更を実行することなく、そこにしか存在しません:))、コンパイルエラーのために最初に知る人になります。

1

スペルミス/ケースメソッド名の違いを避けるために、私に倍の良いカップルを助けています。それがなければ、追跡に時間がかかるこれらの厄介なバグの1つです。

これは機能上の違いはありませんが、コンパイラにはメソッドをオーバーライドしていると言って、そうでない場合は不平を言うことができます。

1

これは、urコードの不足しやすさを増やし、他の人がurコードを維持するのを助けるので、使用することを強くお勧めします。

-4

NO!

役に立つと思われる場合は、実際のIDEが必要です。指定されたメソッドがスーパークラスのメソッドをオーバーライドする(または実施することになっていることを

+3

-1:メソッドがもうオーバーライドされないように、シグネチャを誤って変更したことで決して噛まれたことはありませんか? –

+0

IntelliJを使用して以来、決してありません。 – irreputable

+3

Ummm ...プログラミング言語の設計は、特定のIDEの使用を前提とすべきではありません。 –

16
@Override

を追加する機能は、それはあなたが(注釈を付けることによって)と言うとき、コンパイラがあなたのために二重にチェックすることができますどのよう

Java 6以降のインタフェースメソッド)。メソッドが実際にスーパークラスメソッドをオーバーライドしない場合(またはインターフェイスメソッドを実装する場合)、コンパイラはこれをエラーとしてフラグを立てます。これはしばしば、メソッド名にタイプミスがあるか、メソッドシグネチャを間違えていることを示します。

は、私たちは本当に@Overrideが

それを必要とする必要がありますか?絶対にありませんが、そのように安い道へ

  • が、これはオーバーライドするメソッドであることを人間の読者に明示的に搬送し、コンパイル時で
  • キャッチバグかかることがあり、少なくともあなたもそれ

を探すために知っている...とさえ安いたら、あなたのIDEは時間があるときに、いくつかの脳のサイクルは、実行時でキャッチしますあなたにそれを含めることができます...

-2

個人的に私はそれがIDEのコンパイル時のエラーチェックを除いては便利だと思いませんが、それは私の意見です。理由:あなたは実行時に

Class A { 
    methodName() { System.out.println ("A"); } 
} 

class B extends A { 
    methodName() { System.out.println ("B"); } 
} 

があると、あなたはおそらくB.methodName()を呼び出します - それはB.methodName()はクラスAの同じ名前のメソッドをオーバーライドするかどうかBに問題doesntの()。クラスBには、スーパークラス(A)がmethodName()を実装するかどうかは関係ありません。私は、継承は一方通行であることを意味しています - あなたは@overrideを使って何かを継承することはできません - コンパイラはすべてスーパークラスに同じシグネチャを持つメソッドがあるかどうかをチェックできます - これはとにかく使われません。

誰かがA.javaを編集してmethodName()を削除または名前を変更したり、署名を変更したりすると、B.methodName()を問題なく呼び出すことができます。ただし、その@override 。私はこれもまたではないと思う。 Java言語の一部。

+2

@Override **は** Java言語の一部です。http://java.sun.com/docs/books/jls/third_edition/html/interfaces.html#9.6.1.4 –

+0

を参照してください。私はそれを正しく言いませんでした - 私は一般的にアノテーションについては取っていません - 単に@overrideの実用性。 –

+2

あなたは、それが有用だとは思わないと言ってもいいと思っています。あなたが実際に*言ったことは、間違っていることです。 –

関連する問題