2009-11-13 7 views
8

J'ai besoin d'une méthode qui renvoie une instance du type de classe fourni. Supposons que les types fournis sont limités à telle sorte qu'une instance "vide" d'entre eux puisse être créée. Par exemple, si vous fournissez String.class, une chaîne vide sera renvoyée, un Integer.class renverra un entier dont la valeur initiale est zéro, et ainsi de suite. Mais comment créer des types primitifs (encadrés) à la volée? Comme ça? Est-ce que la seule solution est de parcourir tous les types primitifs possibles, ou existe-t-il une solution plus simple? Notez que les deuxCréation d'une instance primitive (encadrée) lorsque la classe est connue

int.class.newInstance() 

et

Integer.class.newInstance() 

jeter un InstantiationException (parce qu'ils ne sont pas des constructeurs nulaires).

Répondre

12

Je soupçonne que la façon la 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 correct de retourner une référence au même objet sur chaque appel pour le même type.

+0

@Joonas: Ayez un autre regard maintenant :) –

+0

Merci! Cela pourrait fonctionner :) –

+0

Je pense que j'irais pour une chaîne? 'type == long.class? (Long) 0L: ', etc. –

Questions connexes