2009-11-13 11 views
8

Ho bisogno di un metodo che restituisca un'istanza del tipo di classe fornito. Supponiamo che i tipi forniti siano limitati a tale che possa essere creata un'istanza "vuota" di essi. Ad esempio, fornire String.class restituirebbe una stringa vuota, fornendo un valore Integer.class restituirebbe un numero intero il cui valore iniziale è zero e così via. Ma come posso creare al volo tipi primitivi (in scatola)? Come questo?Creazione istanza primitiva (in box) quando la classe è nota

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

È l'unica soluzione per scorrere tutti i possibili tipi primitivi oppure esiste una soluzione più semplice? Si noti che sia

int.class.newInstance() 

e

Integer.class.newInstance() 

tiro un InstantiationException (perché non hanno costruttori nullaria).

risposta

12

ho il sospetto il modo più semplice è quello di avere una mappa:

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 
} 

Fortunatamente tutti questi tipi sono immutabili, quindi va bene per restituire un riferimento allo stesso oggetto su ogni chiamata per lo stesso tipo.

+0

@Joonas: Guarda ora :) –

+0

Grazie! Potrebbe funzionare :) –

+0

Penso che andrei a fare una?: Catena. 'type == long.class? (Lungo) 0L: ', ecc. –

Problemi correlati