クラスが知られているときにプリミティブインスタンスを作成する(箱入り)
質問
付属のクラスタイプのインスタンスを返す方法が必要です。付属のタイプは、それらの「空の」インスタンスを作成できるように制限されていると仮定しましょう。たとえば、供給 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
(彼らには限界コンストラクターがないため)。
解決
最も簡単な方法は、マップを持つことだと思います。
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
}
幸いなことに、これらすべてのタイプは不変であるため、同じタイプの各呼び出しで同じオブジェクトへの参照を返しても大丈夫です。
所属していません StackOverflow