みなさんは Java の『@Override』アノテーションを使っていますか?私は使ってます(`・ω・´)
Java をはじめたときは「エラーなんて Eclipse がおしえてくれるさっ」と思っていましたが、その考え自体が間違っていました。
そもそも『@Override』とは・・・簡単に言ってしまうとスペルミスでメソッドをオーバーライドミスしないための、自分への注意書きである。
「へ?ミスしたら Eclipse がおしえてくれるんじゃないの?」 → いいえ、おしえてくれません。
親クラス hoge.java
public class hoge { public void sukinaSports() { System.out.println("soccer!"); } public void sukinaFruits() { System.out.println("orange!"); } }
子クラス call.java
public class call extends hoge { public void sukinaSport() { System.out.println("golf!"); } public static void main(String[] args) { call cl = new call(); cl.sukinaSports(); cl.sukinaFruits(); } }
実行結果
soccer! orange!
・・・おわかりいただけただろうか?
sukinaSports メソッドをオーバーライドしたはずなのに「soccer!」と表示されてしまっている。そう、メソッド名のスペルミスが原因。
当然、Eclipse はスペルミスしたメソッドを新規メソッドと認識するため、そもそもエラーを吐かないのだ。
「こんなスペルミスするわけない!」とお思いでしょう。でも規模が大きくなってきて、納期が迫ってきて、デスマになってきて、というときに常に100%の自分でいられるでしょうか?そういうときのために @Override を付けることを習慣にしておくと自分が助かります。
子クラス call.java
public class call extends hoge { @Override //←つけてみた public void sukinaSport() { System.out.println("golf!"); } public static void main(String[] args) { call cl = new call(); cl.sukinaSports(); cl.sukinaFruits(); } }
↓
@Override アノテーションをつけた場合、そこでは「必ずメソッドをオーバーライドする」という使命を負うので、スペルミスひいてはバグを抑制することにつながります。
以下は読み流していただいてもOK
例えば、親クラスがインターフェースだった場合、そのメソッドは抽象メソッドしか持っていません。なので、子クラスで implements するとき、抽象メソッドのオーバーライド漏れがあれば Eclipse がエラーを出してくれます。「いけねぇ、いけねぇ」と小声でささやきながら、オーバーライドなり、再abstract するわけです。
しかし、親クラスが通常クラスや抽象クラスで、具象メソッド(実メソッド)を持っている場合。具象メソッドをオーバーライドしない限りは、そのままメソッドが継承されてしまう。このときメソッド名を間違っていると自分ではオーバーライドしたつもりができてないということが起きてしまうわけです。
いかがでしたか?
今日はミスを抑制する Java のアノテーションのお話でした。ちょっとした気遣いでその後のバグを少なくするということは小さいことだけれども、とても大切なことですね。