2008.01.21

こんなコードは書いちゃだめよ(その2)

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


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

-------------------------------------------------------------
public class SuperSample {

  protected String sValue = "SuperSampleValue";

  public void superPrint() {
    System.out.println("sValue = " + sValue);
  }
}

public class SubSample extends SuperSample {

  protected String sValue = "SubSampleValue";

  public void print() {
    System.out.println("sValue = " + sValue);
    superPrint();
  }
}
-------------------------------------------------------------

上記のコードでは、スーパークラス(SuperSample )で
protected 宣言されているインスタンス変数(sValue)と
同じ名前のインスタンス変数をサブクラス(SubSample)で定義しています。

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

#実行結果

sValue = SubSampleValue
sValue = SuperSampleValue
-------------------------------------------------------------

スーパークラス(SuperSample)のインスタンス変数sValueは、
protectedで宣言されているので、
サブクラス(SubSample)でも参照可能です。

ですが、上記のようにサブクラスで同一名のインスタンス変数を
サブクラスで定義してしまうと、当然オーバーライドされてしまいます。
よって、スーパークラス側では、スーパークラス側で宣言されているインスタンス変数の値が利用され、
サブクラス側では、サブクラス側で宣言されているインスタンス変数の値が利用されることになります。
protectedで宣言している意味は、全く無意味になってしまっています。

上記のようなサンプルコードだと、不可解な実装をしていることは一目瞭然なのですが、
インスタンス変数の宣言が多い場合、その間違いは埋もれてしまい、
なかなか判断が付かなくなってしまいます。

たまたま、過去に修正したプログラムに上記のような実装がされたものがあり、
原因を突き止めるのに非常に時間が掛かってしまったことがあります。
前回の間違いコーディングと同様、こんな実装がされているなんて夢にも思わなかったので。。。

コメントを投稿

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

photo
ykato