8

指定されたクラスタイプのインスタンスを返すメソッドが必要です。提供されるタイプが、それらの「空の」インスタンスを作成できるように制限されていると仮定しましょう。たとえば、指定するString.classと空の文字列Integer.classが返され、を指定すると初期値がゼロの整数が返されます。しかし、(ボックス化された)プリミティブ型をその場で作成するにはどうすればよいですか?このような?

public Object newInstance(Class<?> type) {
    if (!type.isPrimitive()) {
        return type.newInstance(); // plus appropriate exception handling
    } else {
        // Now what?
        if (type.equals(Integer.class) || type.equals(int.class)) {
            return new Integer(0);
        }
        if (type.equals(Long.class) // etc.... 
    }
}

考えられるすべてのプリミティブ型を反復処理する唯一の解決策ですか、それとももっと簡単な解決策がありますか?両方に注意してください

int.class.newInstance()

Integer.class.newInstance()

InstantiationException(nullaryコンストラクターがないため)をスローします。

4

1 に答える 1

12

最も簡単な方法は地図を用意することだと思います。

private final static Map<Class<?>, Object> defaultValues = 
    new HashMap<Class<?>, Object>();
static
{
    defaultValues.put(String.class, "");
    defaultValues.put(Integer.class, 0);
    defaultValues.put(int.class, 0);
    defaultValues.put(Long.class, 0L);
    defaultValues.put(long.class, 0L);
    defaultValues.put(Character.class, '\0');
    defaultValues.put(char.class, '\0');
    // etc
}

幸い、これらの型はすべて不変であるため、同じ型の呼び出しごとに同じオブジェクトへの参照を返すことができます。

于 2009-11-13T11:27:05.163 に答える