2007.11.20

こんなコード書いちゃダメよ(その1)

今回は、Javaのプログラミングでやってはいけないコードの書き方を紹介します。


まず、下記のコードを見て下さい。

-------------------------------------------------------------
public class SuperSample {
  private void sampleMethod() {
    System.out.println("SuperSample#sampleMethod()");
  }

  public static void test(SuperSample object) {
    object.sampleMethod();
  }
}

public class SubSample extends SuperSample {
  public void sampleMethod() {
    System.out.println("SubSample#sampleMethod()");
  }
}
-------------------------------------------------------------


上記のコードでは、スーパークラス(SuperSample )で
private 宣言されているメソッド(sampleMethod)と
同じ名前のメソッドをサブクラス(SubSample )で定義しています。

次に、SubSample クラスを下記のような方法で実行してみます。
-------------------------------------------------------------
SubSample subSample = new SubSample();
subSample.sampleMethod();
SuperSample.test(subSample);

#実行結果
SubSample#sampleMethod()
SuperSample#sampleMethod()
-------------------------------------------------------------

スーパークラス(SuperSample )のsampleMethodメソッドが、
publicで宣言されていれば、
SuperSample.test(subSample);
の実行結果は、「SubSample#sampleMethod()」となるはずです。

ですが、上記のようにスーパークラスで private 宣言されているメソッドと
同じ名前のメソッドをサブクラスで定義してしまうと、
private メソッドはオーバーライドされず別のメソッドとして扱われてしまいます。

この実装方法は、バグの元になるので絶対にやってはダメです。
発見するのがかなり難しいです。

私はこれをやられて大変な目にあいました。
このような実装がされているなんて夢にも思わなかったので。。。

コメントを投稿

(いままで、ここでコメントしたことがないときは、コメントを表示する前にこのブログのオーナーの承認が必要になることがあります。承認されるまではコメントは表示されません。そのときはしばらく待ってください。)

photo
ykato