一个类的默认值

时间:2013-04-29 15:53:41

标签: java

如何编写一个返回给定类默认值的函数?如果一个类是其中一个原语,它应该返回一个带默认值的包装类,否则返回null。

public <B> Object defaultValue(Class<B> clazz) {
    return clazz.isPrimitive() ? ... : null;
}

因此对于int.class,它应该返回Integer(0)

4 个答案:

答案 0 :(得分:3)

  

如何编写一个返回给定类默认值的函数?如果一个类是其中一个原语,它应该返回一个带默认值的包装类,否则返回null。

所以我假设对于像int.class这样的原语你要返回new Integer(0),但是对于让我们说想要返回的对象null

如果确实如此,您可以使用数组在开始时填充默认值的事实。也许这样尝试

import java.lang.reflect.Array;
...

public static <B> Object defaultValue(Class<B> clazz) {
    return Array.get(Array.newInstance(clazz, 1),0);
}
  • Array.newInstance(clazz, 1)将创建一个类型clazz的数组,其中包含一个默认元素
  • Array.get(<someArray>, 0)将返回其第一个元素。
  • 由于您的方法defaultValue会返回对象,因此会自动将其自动设置为相应的类型int - &gt; Integer

实施例

System.out.println(defaultValue(int.class));
System.out.println(defaultValue(int.class).getClass());

打印

0
class java.lang.Integer

答案 1 :(得分:1)

实现它的一种方法是使用地图来存储值:

private static Map<Class, Object> defaultValues = new HashMap<Class, Object>();

static {
    defaultValues.put(byte.class, 0);
    defaultValues.put(short.class, 0);
    defaultValues.put(int.class, 0);
    defaultValues.put(long.class, 0L);
    defaultValues.put(float.class, 0.0f);
    defaultValues.put(double.class, 0.0d);
    defaultValues.put(char.class, '\u0000');
    defaultValues.put(boolean.class, false);
}

public <B> Object defaultValue(Class<B> clazz) {
    return defaultValues.containsKey(clazz) ? defaultValues.get(clazz) : null;
}

答案 2 :(得分:1)

您可以使用Apache lang3 libraryClassUtils类:

import org.apache.commons.lang3.ClassUtils;

public Object defaultValue(Class<?> clazz) throws InstantiationException, IllegalAccessException,
        IllegalArgumentException, InvocationTargetException {
    final Class<?> c = ClassUtils.primitiveToWrapper(clazz);
    if (c != null && !c.equals(clazz)) {
        final Constructor[] ctors = c.getConstructors();
        Constructor ctor = null;
        for (int i = 0; i < ctors.length; i++) {
            ctor = ctors[i];
            if (ctor.getGenericParameterTypes().length == 0)
            break;
        }
        return ctor.newInstance(0);
    } else {
        return null;
    }
}

如果给定的类不是基元,则返回null。您可能希望以更好的方式处理异常。

答案 3 :(得分:0)

你为什么需要这个?默认是由编译器完成的,而不是通过调用现有方法。

以下是基元的默认值,您当然可以编写一个函数将该表转换为值...

Data Type   Default Value (for fields)
byte        0
short       0
int         0
long        0L
float       0.0f
double      0.0d
char        '\u0000'
Object      null
boolean     false

Read this tutorial link