そろそろお盆休みの時期ですね。
こちらのBarも閑散としています。ビジネスマンのご利用が多いようですからね。
それとも、あまりにマニアックなものしか出さないから敬遠されてるんでしょうか orz
気を取り直して前回に引き続き
ジェネリクスと内部クラスのカクテルでお届けします。
前回はstaticな内部クラスとエンクロージング型の内部クラスでした。
今回はローカルな内部クラスで行ってみましょう。
ローカルな内部クラス
public class Hoge<T> {
public static void main(String[] args) {
// staticメソッド内のローカルな内部クラス
class Piyo {
// 外部クラスのインスタンスと結びついていないためNG!
T field;
}
}
public void hoge() {
// インスタンスメソッド内のローカルな内部クラス
class Piyo {
// 外部クラスのインスタンスと結びつくのでOK!
T field;
}
}
}
ローカルな内部クラスはメソッド内で定義するクラスです。
無名クラスと違い、名前を持つので複数のインスタンスを生成することが出来ます。
ローカルな内部クラスはその定義されたメソッドがstaticか
否かで挙動が違ってきます。
staticメソッド内で宣言されている場合、
staticな内部クラス同等に外部クラスのインスタンスとは無関係ですから、
外部クラスのインスタンス別の情報である型パラメータを参照することが出来ません。
ですから、上記サンプルではTの箇所でエラーとなります。
インスタンスメソッド内で定義されたローカル内部クラスの場合は、エンクロージング型内部クラスとほぼ同等です。
外部クラスのインスタンスとの結びつきを持ちますから外部クラスの型パラメータをそのまま使用できます。
エンクロージング型はnewの際に絡みつく外部クラスのインスタンスを
指定できますが、ローカルな内部クラスでは宣言されているインスタンスメソッドでの
thisインスタンスが親となります。
public class Hoge<T> {
public static <X> void main(String[] args) {
// 外部クラス側で宣言されたfinal変数
final X outerVar = null;
// staticメソッド内のローカルな内部クラス
class Piyo {
// メソッドローカルな型パラメータは利用可能
X field;
void piyo() {
// 外部クラスでのfinal変数を利用することもできる
this.field = outerVar;
}
}
}
}
staticメソッド内のローカル内部クラスでもメソッドローカルな
型パラメータであれば使用することが出来ます。
上記サンプルではmainメソッドにローカルな型パラメータXが宣言されています。
クラスPiyo内で型パラメータXが使用できているのがわかるでしょうか?
もちろん、ローカルな内部クラスとしての特権として外部のfinalな
変数の参照も行うことができます。その際に外部の型パラメータが利用できないと困りますものね。
インスタンスメソッド内でもメソッドローカルな型パラメータを使用することが出来ます。
このあたりの事情はstaticメソッド内のローカル内部クラスと変わりません。
いかがだったでしょうか?場合分けして追っていてもなかなか複雑ですね。
しかし、このあたりをうまく活用するとクラス設計の幅が広がりますよ。
次回は無名クラスでお届けします。それではまた。
投稿日時 : 2007年8月11日 10:18