java - 如何获取 Java 中类型的默认值?

标签 java

我正在编写一个调用方法的包装器,如果抛出异常,则记录它并返回默认值。

InvocationHandler invocationHandler = new InvocationHandler() {
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
        try {
            return invokeOn(wrapped, method, args);
        } catch (InvocationTargetException e) {
            Throwable targetException = e.getTargetException();
            if (targetException instanceof Exception) {
                errorReporter.exception(wrapped, (Exception) targetException);
                return defaultValueFor(method.getReturnType());
            } else {
                throw targetException;
            }
        }
    }
};

我想找到一种实现 defaultValueFor 的好方法,以便它为每种可能的类型返回一个好的默认值 - 相当于

@SuppressWarnings("unchecked")
protected static <T> T defaultValueFor(Class<T> claz) {
    if (claz == boolean.class)
        return (T) Boolean.FALSE;
    if (claz == short.class)
        return (T) Short.valueOf((short) 0);
    if (claz == int.class)
        return (T) Integer.valueOf(0);
    if (claz == long.class)
        return (T) Long.valueOf(0);
    ...
    return null;
}

这种代码必须在 JMock 等中,但是有没有比这个可怕的样板更好的实现?

最佳答案

class DefaultValues {
    static final Map<Class<?>,Object> defaultValues = new HashMap<Class<?>,Object>();

    // load
    static {
        defaultValues.put(boolean.class, Boolean.FALSE);
        defaultValues.put(byte.class, new Byte((byte)0));
        defaultValues.put(short.class, new Short((short)0));
        defaultValues.put(int.class, new Integer(0));
        defaultValues.put(long.class, new Long(0L));
        defaultValues.put(char.class, new Character('\0'));
        defaultValues.put(float.class, new Float(0.0F));
        defaultValues.put(double.class, new Double(0.0));
    }

    public static final <T> T defaultValueFor(Class<T> clazz) {
        return (T)defaultValues.get(clazz);
    }

}

关于java - 如何获取 Java 中类型的默认值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5328582/

相关文章:

java - 在 C++ 中将文本写入图像

java - 如何在排序结束时始终有空值

java - Python PIP 风格的本地 Java 包管理系统?

java - org.apache.axis.message.SOAPBodyElement 无法转换为 weblogic.xml.xmlnode.XMLNode

java - 如何停止 EJBException 的堆栈跟踪(在每个抛出的异常中)

java.util.logging.Logger 在 Linux 上不会写入日志文件

java - 无法在 Java 中以编程方式更新定期 session

java - java中的垃圾收集器方法有什么用?

java - 在 Lotus Notes 中通过 Java 代理获取 Web 服务器站点?

java - FFmpeg 音频不同步问题