在知道类时创建(盒装)原始实例

时间:2009-11-13 11:25:30

标签: java class types primitive boxing

我需要一个返回所提供类类型实例的方法。让我们假设提供的类型被限制为可以创建它们的“空”实例。例如,提供String.class将返回一个空字符串,提供Integer.class将返回一个初始值为零的Integer,依此类推。但是我如何动态创建(盒装)原始类型?喜欢这个?

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 个答案:

答案 0 :(得分: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
}

幸运的是,所有这些类型都是不可变的,因此可以在每次调用时为同一类型返回对同一对象的引用。