2009-11-13 2 views
8

Мне нужен метод, который возвращает экземпляр класса класса. Предположим, что поставляемые типы ограничены такими, что может быть создан «пустой» экземпляр. Например, при поставке String.class будет возвращена пустая строка, и для доставки Integer.class будет возвращено целое число, начальное значение которого равно нулю и т. Д. Но как я могу создавать (в штучной упаковке) примитивные типы на лету? Как это?Создание (в штучной упаковке) примитивного экземпляра, когда класс известен

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

Является единственным решением для итерации всех возможных примитивных типов или существует более простое решение? Обратите внимание, что оба

int.class.newInstance() 

и

Integer.class.newInstance() 

бросить InstantiationException (потому что они не имеют нульарных конструкторов).

ответ

12

Я подозреваю, что самый простой способ иметь карту:

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 
} 

К счастью, все эти типы являются неизменяемыми, так что это нормально, чтобы вернуть ссылку на тот же объект при каждом вызове для того же типа.

+0

@Joonas: Посмотрите еще один раз :) –

+0

Спасибо! Это может сработать :) –

+0

Думаю, я бы пошел на цепочку:. 'type == long.class? (Long) 0L: 'и т. Д. –