<< 猫ページ | Home | Akumaで、Javaプログラムをデーモン化 >>
PR: 転職    お墓    エコ    通販    結婚相談所    シルバー    質屋    葬式    漫画    エステサロン   

可変引数

可変引数を使っていると、可変引数を受け取りつつ、別のメソッドに引数を追加しながら引き渡すようなコードを書きたくなることが良くある。

static final String[] defaultArg = {...};

Foo(String... arg) {
super (defaultArg, arg);
}

コンパイラがこれ、許してくれればいいんだけど、残念ながらコンパイルエラー。super()呼ぶ前に自分で配列を作ろうかと思っても、super()呼び出しは先頭に置かなければならないという掟があるため、うまくいかない。でまぁ、こういう場合は、やはりビルダパターンかなと。

public class TypedVarArgBuilder<T> {
List<T> args = new ArrayList<T>(8);

public TypedVarArgBuilder<T> add(Collection<T> itr) {
args.addAll(itr);
return this;
}

public TypedVarArgBuilder<T> add(T... array) {
args.addAll(Arrays.asList(array));
return this;
}

public T[] build() {
...

はうっ、Generic array生成か。new T[size]というのは無理なんで、Array.newInstance()とか使うことになってしまう。引数リスト1つ作るたびにリフレクションは避けたいよねぇ。どうもうまくいかないな。やはり配列をnewするファクトリを渡してもらうというあたりが落とし所かなぁ。

    public T[] build() {
return args.toArray(createArray(args.size()));
}

abstract protected T[] createArray(int size);
class Foo {
Foo(String... arg) {
for (String s: arg) System.out.println(s);
}
}

public class Bar extends Foo {
static final String[] defaultArg = {"Hello", "World"};

Bar(String... arg) {
super (new TypedVarArgBuilder<String>() {
protected String[] createArray(int size) {
return new String[size];
}
}
.add(defaultArg)
.add(arg)
.build());
}

public static void main(String[] args) {
new Bar("Foo", "Bar");
}
}

う〜んメンドイな。あとは実行時にバイトコード生成するか。さすがにやり過ぎな気がする。




コメント追加 トラックバック送信
このサイトの掲載内容は私自身の見解であり、必ずしもIBMの立場、戦略、意見を代表するものではありません。
日本アイ・ビー・エム 花井 志生 Since 1997.6.8