【问题标题】:Creating (boxed) primitive instance when the class is known当类已知时创建(盒装)原始实例
【发布时间】:2010-12-16 06:22:03
【问题描述】:

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

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(因为它们没有空构造函数)。

【问题讨论】:

    标签: java class types primitive boxing


    【解决方案1】:

    我怀疑最简单的方法是有一张地图:

    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
    }
    

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

    【讨论】:

    • @Joonas:现在再看看 :)
    • 我想我会选择一个 ?: 链。 type==long.class ? (Long)0L :
    • @Tom:有什么特别的原因吗?表现?可读性?一旦构建了地图,方法代码基本上就是查找,所以很好读。我通常对链式条件句很好,但在这种情况下,我不确定我是否看到了优势。请注意,也没有太多缺点
    • @Jon:如果 OP 需要包含可变类(如 StringBuilder),您希望如何更改您的解决方案?
    • @CPerkins:那时我可能会改变策略,可能会像汤姆的建议那样。我的回答是针对所问的确切问题:)
    猜你喜欢
    • 2023-03-13
    • 2019-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多