ランナブルにこのメソッドがあるとしましょう。私はいつもその @override を削除します。しかし、これに悪影響があるかどうか知りたいですか?検索しようとしましたが、何も見つかりませんでした。
@Override
public void run() {
while (running) {
}
}
注釈は、@Override
本番コードに何の違いももたらしません。実際、注釈はクラスの Java バイトコードでさえエンコードされていません。これは注釈の定義に記載されています。
@Target(value=METHOD)
@Retention(value=SOURCE)
public @interface Override
ソースコードにのみ保持されます。
それで、ポイントは何ですか?まあ、それはコンパイル時にチェックされるものです。これにより、スーパークラスのメソッドを意図的にオーバーライドしていることを示すことができます。
@Override
親メソッドをオーバーライドしていないメソッドにアノテーションを追加すると、コンパイル エラーが発生することに気付くでしょう。
この背後にある考え方は、サードパーティ ライブラリからクラスを拡張し、そのメソッドの 1 つをオーバーライドする場合、そのメソッドが存在しなくなった場合に警告する必要があるということです。使用している外部ライブラリのバージョンをアップグレードすることを検討してください。メソッドの代わりにvoid run()
was now void run(String threadName)
.
その場合、オーバーライドされたメソッドは親メソッドをオーバーライドしなくなるため、呼び出されることはありません (インターフェースを実装しているため、最良の例ではありません。コンパイルはとにかく失敗しますが、それがクラスである場合を想像してください)。
このアノテーションは、クラスやインターフェイスからメソッドをオーバーライドするときに設定できます (ただし、これは Java 1.6 以降でのみサポートされています)。
機能的には、違いはありません。
ただし、アノテーションをrun()
使用すると、オーバーライドするメソッドがあるという追加のチェックが得られます。これにより、使用していると思われるインターフェイスを使用していないバグをキャッチできます。
できますが、コンパイル時のチェックが無効になり、読みにくくなります。そのままにしておいても費用がかからないため、アノテーションを削除する手間はかかりません。
句を追加すると、スーパータイプのメソッドをオーバーライドしていることをコンパイラに暗黙的に伝え、スーパークラスの同じ名前のメソッドをチェックするようにします。これは、何かのスペルを間違えたり、メソッドの戻り値の型が同じでない場合に、コンパイラが通知することを意味します。