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

¿Fue útil?

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.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top