Создание (в штучной) примитивном экземпляре, когда класс известен

StackOverflow https://stackoverflow.com/questions/1728650

Вопрос

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

Это было полезно?

Решение

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

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
}

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top