Question

J'ai besoin d'une méthode qui renvoie une instance du type de classe fourni. Supposons que les types fournis se limitent à une instance "vide" d'entre eux peuvent être créés. Par exemple, la fourniture String.class retournerait une chaîne vide, fournissant un Integer.class Renvoie un entier dont la valeur initiale est nul, et ainsi de suite. Mais comment créer des types primitifs (en boîte) à la volée? Comme ça?

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

Est-ce la seule solution pour itérer tous les types primitifs possibles, ou y a-t-il une solution plus simple? Notez que les deux

int.class.newInstance()

et

Integer.class.newInstance()

jeter un InstantiationException (Parce qu'ils n'ont pas de constructeurs nullaires).

Était-ce utile?

La solution

Je soupçonne que le moyen le plus simple est d'avoir une carte:

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
}

Heureusement, tous ces types sont immuables, il est donc normal de renvoyer une référence au même objet sur chaque appel pour le même type.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top