Criando uma instância primitiva (em caixa) quando a classe é conhecida
Pergunta
Preciso de um método que retorne uma instância do tipo de classe fornecido. Vamos supor que os tipos fornecidos sejam limitados a que uma instância "vazia" deles possa ser criada. Por exemplo, fornecendo String.class
retornaria uma corda vazia, fornecendo um Integer.class
retornaria um número inteiro cujo valor inicial é zero e assim por diante. Mas como faço para criar tipos primitivos (em caixa) em tempo real? Assim?
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....
}
}
É a única solução para iterar em todos os tipos primitivos possíveis ou existe uma solução mais direta? Observe que ambos
int.class.newInstance()
e
Integer.class.newInstance()
jogue um InstantiationException
(porque eles não têm construtores nulares).
Solução
Eu suspeito que a maneira mais simples é ter um 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
}
Felizmente, todos esses tipos são imutáveis, por isso não há problema em devolver uma referência ao mesmo objeto em cada chamada para o mesmo tipo.