可変引数
可変引数を使っていると、可変引数を受け取りつつ、別のメソッドに引数を追加しながら引き渡すようなコードを書きたくなることが良くある。
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");
}
}
う〜んメンドイな。あとは実行時にバイトコード生成するか。さすがにやり過ぎな気がする。





