提供されたクラス型のインスタンスを返すメソッドが必要です。提供されたタイプが、それらの「空の」インスタンスを作成できるように制限されていると仮定しましょう。たとえば、指定する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コンストラクタがないため)をスローします。
私は最も簡単な方法は地図を持つことだと思います:
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
}
幸い、これらの型はすべて不変であるため、同じ型の各呼び出しで同じオブジェクトへの参照を返すことは問題ありません。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加