[Java 5]オーバライドのミスを撲滅する@OverrideJavaTips 〜Javaプログラミング編

» 2007年05月29日 10時00分 公開
[平野正喜@IT]

アノテーションを活用しよう!

 JDK 1.4まではjava.langパッケージはインターフェイス、クラス、例外(クラス)、エラー(クラス)の4種類の要素から構成されていました。Java 5では、ここに列挙型として「Thread.State」、注釈タイプとして「Deprecated」「Override」「SuppressWarnings」の3つが追加されています。

 本項では、これらの新要素の中からプログラミングでありがちなオーバライドのミスを撲滅する強力な効果を持つ「Override」を説明します。

 注釈タイプは既存のJavaの文法との関連から「public @interface」という接頭語で表現されていますが、「Override」は「アノテーション型」と説明されており、前に「@」を付加してメソッドの前に定義することで、そのメソッドがオーバライドメソッドであることをコンパイラに通知できます。

 よって、メソッドの前に「@Override」と記述することで、プログラムのミスによりオーバライドが成立していない場合には、コンパイラが通知してくれます。また、そのメソッドの作成者以外がプログラムを見たときに、それがオーバライドであることが一目瞭然、というメリットもあります。

オーバライドが成立しないプログラムミスをチェックする

 一例として、プログラマのタイプミスにより、オーバライドしたはずのメソッドが呼ばれないという場合を示します。

図1 税込会計のメソッドを呼んだはずなのに…… 図1 税込会計のメソッドを呼んだはずなのに……

 このプログラムは、Acount(会計)クラスをスーパークラスとするAcountWithTax(税込会計)クラスが、スーパークラスでは「単価×数量」であるcalcPrice(価格計算)メソッドを「単価×数量×税」としてオーバライドするという仕組みです。しかし、結果を見てのとおり、100円×5個の税込価格が500円、つまり無税になってしまっています。

 すでにお気付きと思いますが、サブクラス(11行目)で「オーバライドしたつもり」のメソッド名が間違っている(calcPriceのはずがcalcPrise)のが原因です。よって、オーバライドが成立せず、19行目で呼ばれているのはスーパークラスから継承されたcalcPrice(価格計算)メソッドとなりますので、「100×5=500」が表示されてしまったわけです。

 ここで、Eclipseをお使いで、使い慣れている方であれば、11行目にオーバライドのマークが出ていないことからタイプミスに気付きやすいと思いますが、そうでない場合や、巨大で複数のソースやパッケージにまたがるプログラムでは、コンパイルでエラーが出ないために、ミスの発見に時間がかかったり、最悪の場合、ミスを見逃してしまう危険性があります。

 そこで、お勧めしたいのが「@Override」の付記です。このプログラムに「@Override」を付記してみましょう。

図2 @Overrideを付記すると、エラー表示が 図2 @Overrideを付記すると、エラー表示が

 見てのとおり、エラーが表示され、このエラー表示にマウスを載せると、下記のメッセージが得られます。

図3 オーバーライドができていないことを教えてくれる(Eclipse) 図3 オーバライドができていないことを教えてくれる(Eclipse)

 なお、javacコマンドの場合、下記のように違うメッセージが得られます。

図4 オーバーライドができていないことを教えてくれる(javac) 図4 オーバライドができていないことを教えてくれる(javac)

 ご参考までに修正後は以下のようになります。11行目にある▲がEclipseが表示してくれるオーバライドのマークです。

図5 修正後、結果は正しく「525」になる 図5 修正後、結果は正しく「525」になる

 Java 5では、Auto-BoxingやVarargsなどの導入で、プログラミングの自由度が上がった代わりに、オーバライドやオーバロードが分かりづらくなり、ミスを起こしやすくなっています。「@Override」の活用でオーバライドのミスを撲滅しましょう。

Profile

RunDog.org

平野正喜


Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。