Creación de instancias primitivas (en caja) Cuando se conoce la clase
Pregunta
Necesito un método que devuelva una instancia del tipo de clase suministrada. Supongamos que los tipos suministrados se limitan a tal que se puede crear una instancia "vacía" de ellos. Por ejemplo, suministrando String.class
devolvería una cadena vacía, suministrando una Integer.class
devolvería un entero cuyo valor inicial es cero, y así sucesivamente. Pero, ¿cómo creo tipos primitivos (en caja) en la marcha? ¿Como esto?
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....
}
}
¿Es la única solución para iterar a través de todos los tipos primitivos posibles, o hay una solución más directa? Tenga en cuenta que ambos
int.class.newInstance()
y
Integer.class.newInstance()
tirar un InstantiationException
(Porque no tienen constructores nusulares).
Solución
Sospecho que la forma más simple es tener un mapa:
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
}
Afortunadamente, todos estos tipos son inmutables, por lo que está bien devolver una referencia al mismo objeto en cada llamada para el mismo tipo.