获取基本类型的默认值

rip*_*234 49 java reflection guava

我手边有一个Java原始类型:

Class<?> c = int.class; // or long.class, or boolean.class
Run Code Online (Sandbox Code Playgroud)

我想获得此类的默认值 - 具体而言,如果未初始化该值,则将该值分配给此类型的字段.例如,0对于数字,false对于布尔值.

有没有通用的方法来做到这一点?我试过这个:

c.newInstance()
Run Code Online (Sandbox Code Playgroud)

但我得到的是一个InstantiationException,而不是一个默认的实例.

whi*_*rra 53

Guava Libraries已经包含:http:
//guava-libraries.googlecode.com/svn/trunk/javadoc/com/google/common/base/Defaults.html

调用defaultValue将返回任何基本类型的默认值(由JLS指定),并为任何其他类型返回null.

像这样使用它:

import com.google.common.base.Defaults;
Defaults.defaultValue(Integer.TYPE); //will return 0
Run Code Online (Sandbox Code Playgroud)

  • 我将通过添加示例代码行来改进这个答案。例如: `Defaults.defaultValue(long.class)` 我这么说是因为直到现在我才意识到你可以在原始类型上调用 `.class`。 (2认同)

Ant*_*g99 18

通过创建一个元素的数组并检索其第一个值,可以获得任何类型的默认值.

private static <T> T getDefaultValue(Class<T> clazz) {
    return (T) Array.get(Array.newInstance(clazz, 1), 0);
}
Run Code Online (Sandbox Code Playgroud)

这种方式不需要考虑每种可能的原始类型,创建单元素阵列的成本通常可以忽略不计.

  • @LoBo这不是问题; 无论如何,返回的值将是一个对象. (2认同)

Jac*_*eow 11

这就是我的想法(虽然没有通过优雅测试):

public class PrimitiveDefaults {
    // These gets initialized to their default values
    private static boolean DEFAULT_BOOLEAN;
    private static byte DEFAULT_BYTE;
    private static short DEFAULT_SHORT;
    private static int DEFAULT_INT;
    private static long DEFAULT_LONG;
    private static float DEFAULT_FLOAT;
    private static double DEFAULT_DOUBLE;

    public static Object getDefaultValue(Class clazz) {
        if (clazz.equals(boolean.class)) {
            return DEFAULT_BOOLEAN;
        } else if (clazz.equals(byte.class)) {
            return DEFAULT_BYTE;
        } else if (clazz.equals(short.class)) {
            return DEFAULT_SHORT;
        } else if (clazz.equals(int.class)) {
            return DEFAULT_INT;
        } else if (clazz.equals(long.class)) {
            return DEFAULT_LONG;
        } else if (clazz.equals(float.class)) {
            return DEFAULT_FLOAT;
        } else if (clazz.equals(double.class)) {
            return DEFAULT_DOUBLE;
        } else {
            throw new IllegalArgumentException(
                "Class type " + clazz + " not supported");
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 其实这很整洁.应该是IMO接受的答案. (2认同)

Jul*_*yer 7

Guava的替代品Defaults.java,它允许实现找出默认值(通过使用Antag99的答案改进):

import static java.util.stream.Collectors.toMap;

import java.lang.reflect.Array;
import java.util.Map;
import java.util.stream.Stream;

public class DefaultValue {
    /**
     * @param clazz
     *            the class for which a default value is needed
     * @return A reasonable default value for the given class (the boxed default
     *         value for primitives, <code>null</code> otherwise).
     */
    @SuppressWarnings("unchecked")
    public static <T> T forClass(Class<T> clazz) {
        return (T) DEFAULT_VALUES.get(clazz);
    }

    private static final Map<Class<?>, Object> DEFAULT_VALUES = Stream
            .of(boolean.class, byte.class, char.class, double.class, float.class, int.class, long.class, short.class)
            .collect(toMap(clazz -> (Class<?>) clazz, clazz -> Array.get(Array.newInstance(clazz, 1), 0)));

    public static void main(String... args) {
        System.out.println(DefaultValue.forClass(int.class)); // 0
        System.out.println(DefaultValue.forClass(Integer.class)); // null
    }
}
Run Code Online (Sandbox Code Playgroud)