Создание (в штучной упаковке) примитивного экземпляра, когда класс известен - PullRequest
8 голосов
/ 13 ноября 2009

Мне нужен метод, который возвращает экземпляр предоставленного типа класса. Предположим, что предоставленные типы ограничены таким образом, что их можно создать «пустым» экземпляром. Например, предоставление 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 (потому что у них нет нулевых конструкторов).

1 Ответ

12 голосов
/ 13 ноября 2009

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

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
}

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

...