日々常々

ふつうのプログラマがあたりまえにしたいこと。

フィールドの隠蔽

http://d.hatena.ne.jp/irof/20110305/p1 でコメント頂いたネタ。
ちょっとしたクイズになるのかな。

どんな結果になるか難なく判るなら、初心者*1からは脱していると思います。難なくじゃなくても、悩めるならたぶん大丈夫です。

public class Quiz {

	public static void main(String[] args) {
		SuperClass clz1 = new SuperClass();
		System.out.println(clz1);
		System.out.println(clz1.field);
		System.out.println(clz1.method());
		System.out.println(clz1.getField());

		SubClass clz2 = new SubClass();
		System.out.println(clz2);
		System.out.println(clz2.field);
		System.out.println(clz2.method());
		System.out.println(clz2.getField());

		SuperClass clz3 = new SubClass();
		System.out.println(clz3);
		System.out.println(clz3.field);
		System.out.println(clz3.method());
		System.out.println(clz3.getField());
	}

}

class SuperClass {
	String field = "superField";

	String method() {
		return "superMethod";
	}

	String getField() {
		return field;
	}
}

class SubClass extends SuperClass {
	String field = "subField";

	String method() {
		return "subMethod";
	}
}


結果。

blog.SuperClass@55f33675
superField
superMethod
superField
blog.SubClass@527c6768
subField
subMethod
superField
blog.SubClass@65690726
superField
subMethod
superField

同名フィールドのサブクラスでの定義はバグりますから禁止…。挙動を理解してわざわざ使う人なんて居ないよね。こうしてクイズネタにする以外の上手い使い方思いつかないし。Eclipseも警告出せるけど、デフォルトはIgnoreなんですかね。あれErrorにしちゃって良いと思うくらい。


ところでしゃどーいんぐって覚えてたんだけど、はいでぃんぐの方が正解っぽい。以下はプログラミング言語第4版より。

用語隠蔽(hidding)は …中略… 継承されたメンバーがローカルに宣言されたメンバーにより隠蔽されている場合です。そして、他の状況は、シャドウ(shadowing)と呼ばれます。この違いは、本書では重要ではないので、単に「隠蔽」と呼ぶことにします。

太字は私による、私のための強調。特に重要じゃないよね!…すみません。はいでぃんぐはいでぃんぐ。よし覚えた。
shadowingはクラスフィールドに対して同名のメソッドフィールドを定義する場合とかを言うっぽいかな。こっちは特に意識せず適切な名前だと判断すれば使います。スコープが一目でわかる程度に限定できていれば混乱しないし。もっとも、大きなメソッドで使うのはNGです。そもそもそんな大きなメソッド自体がNGですけど。


ちなみに上記例に対して、こう書いてもコンパイル出来たりします。困った話です。これだけでも使わない方がいい理由になると思うのです。

class SubClass extends SuperClass {
	int field = 0;

	String method() {
		return "subMethod";
	}
}


プログラミング言語Java (The Java Series)

プログラミング言語Java (The Java Series)

  • 作者: ケン・アーノルド,ジェームズゴスリン,デビッドホームズ,柴田芳樹
  • 出版社/メーカー: ピアソンエデュケーション
  • 発売日: 2007/04
  • メディア: 単行本
  • 購入: 38人 クリック: 1,044回
  • この商品を含むブログ (73件) を見る

*1:いわゆる初心者本を読んで「文法は何となく判った」程度