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).

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top