JDK 1.4まではjava.langパッケージはインターフェイス、クラス、例外(クラス)、エラー(クラス)の4種類の要素から構成されていました。Java 5では、ここに列挙型として「Thread.State」、注釈タイプとして「Deprecated」「Override」「SuppressWarnings」の3つが追加されています。
本項では、これらの新要素の中からプログラミングでありがちなオーバライドのミスを撲滅する強力な効果を持つ「Override」を説明します。
注釈タイプは既存のJavaの文法との関連から「public @interface」という接頭語で表現されていますが、「Override」は「アノテーション型」と説明されており、前に「@」を付加してメソッドの前に定義することで、そのメソッドがオーバライドメソッドであることをコンパイラに通知できます。
よって、メソッドの前に「@Override」と記述することで、プログラムのミスによりオーバライドが成立していない場合には、コンパイラが通知してくれます。また、そのメソッドの作成者以外がプログラムを見たときに、それがオーバライドであることが一目瞭然、というメリットもあります。
一例として、プログラマのタイプミスにより、オーバライドしたはずのメソッドが呼ばれないという場合を示します。
このプログラムは、Acount(会計)クラスをスーパークラスとするAcountWithTax(税込会計)クラスが、スーパークラスでは「単価×数量」であるcalcPrice(価格計算)メソッドを「単価×数量×税」としてオーバライドするという仕組みです。しかし、結果を見てのとおり、100円×5個の税込価格が500円、つまり無税になってしまっています。
すでにお気付きと思いますが、サブクラス(11行目)で「オーバライドしたつもり」のメソッド名が間違っている(calcPriceのはずがcalcPrise)のが原因です。よって、オーバライドが成立せず、19行目で呼ばれているのはスーパークラスから継承されたcalcPrice(価格計算)メソッドとなりますので、「100×5=500」が表示されてしまったわけです。
ここで、Eclipseをお使いで、使い慣れている方であれば、11行目にオーバライドのマークが出ていないことからタイプミスに気付きやすいと思いますが、そうでない場合や、巨大で複数のソースやパッケージにまたがるプログラムでは、コンパイルでエラーが出ないために、ミスの発見に時間がかかったり、最悪の場合、ミスを見逃してしまう危険性があります。
そこで、お勧めしたいのが「@Override」の付記です。このプログラムに「@Override」を付記してみましょう。
見てのとおり、エラーが表示され、このエラー表示にマウスを載せると、下記のメッセージが得られます。
なお、javacコマンドの場合、下記のように違うメッセージが得られます。
ご参考までに修正後は以下のようになります。11行目にある▲がEclipseが表示してくれるオーバライドのマークです。
Java 5では、Auto-BoxingやVarargsなどの導入で、プログラミングの自由度が上がった代わりに、オーバライドやオーバロードが分かりづらくなり、ミスを起こしやすくなっています。「@Override」の活用でオーバライドのミスを撲滅しましょう。
Copyright © ITmedia, Inc. All Rights Reserved.