gpt4 book ai didi

java - 如何从 String 转换为原始类型或标准 java 包装类型

转载 作者:行者123 更新时间:2023-12-02 08:37:13 26 4
gpt4 key购买 nike

我有一个java.lang.reflect.InvocationHandler,我需要实现方法invoke()

根据我的阐述,我有一个 java.lang.String 类型的值,我需要将该值转换为该方法所需的适当 returnType(它可以是像 int、boolean 等原语, double 或包装类(如 Boolean、Integer、Double、Float 等)。

示例:

public Object invoke(Object proxy, Method method, Object[] args) 
throws Throwable {
String computedValue = compute(...);
return convert(method.getReturnType(), computedValue);
}

private Object convert(Class<?> returnType, String stringValue) {
return ...; // what's the simplest way?
}

我并不期望简单地实现复杂对象之间的自动转换,但我期望有一种简单的方法来从 String 转换为标准 java 类型。

我已经见过(太多)很多次这样的东西了,但它似乎不适合我:

public static Object toObject( Class clazz, String value ) {
if( Boolean.class.isAssignableFrom( clazz ) ) return Boolean.parseBoolean( value );
if( Byte.class.isAssignableFrom( clazz ) ) return Byte.parseByte( value );
if( Short.class.isAssignableFrom( clazz ) ) return Short.parseShort( value );
if( Integer.class.isAssignableFrom( clazz ) ) return Integer.parseInteger( value );
if( Long.class.isAssignableFrom( clazz ) ) return Long.parseLong( value );
if( Float.class.isAssignableFrom( clazz ) ) return Float.parseFloat( value );
if( Double.class.isAssignableFrom( clazz ) ) return Double.parseDouble( value );
return value;
}

到目前为止,上面的内容还不是我看到的最糟糕的:)

有人有什么秘诀吗?

最佳答案

据我所知,您提供的版本没有真正的替代方案。您可以稍微简化一下(因为包装器类型都是 final ),但您本质上需要使用 ifswitch或散列来打开类。

我的建议是像上面那样编码。如果您必须查看丑陋的代码,那么它本身只是一个问题。因此,将其放入实用程序方法中,并且不要再查看它。

<小时/>

FWIW - 这就是我简化方法的方式:

public static Object toObject( Class clazz, String value ) {
if( Boolean.class == clazz ) return Boolean.parseBoolean( value );
if( Byte.class == clazz ) return Byte.parseByte( value );
if( Short.class == clazz ) return Short.parseShort( value );
if( Integer.class == clazz ) return Integer.parseInt( value );
if( Long.class == clazz ) return Long.parseLong( value );
if( Float.class == clazz ) return Float.parseFloat( value );
if( Double.class == clazz ) return Double.parseDouble( value );
return value;
}

这样更简单、更高效。它相当于原始版本,因为类都是 final因为规范规定 Class 相等对象是对象标识。

可以说,我们应该使用 <wrapper>.valueOf(String)直接返回包装对象的方法。

我并不认为这不那么难看......但是“美观”并不是衡量代码质量的有用标准,因为它是主观的,并且因为它不能告诉您代码是否易于理解和/或维护。

更新

要也支持基本类型,请将相应的类添加到 if状况;例如

    if (Boolean.class == clazz || Boolean.TYPE == clazz) {
return Boolean.parseBoolean(value);
}

现在可能已经到了对类型名称进行字符串切换更有效的地步,尽管需要考虑一些类型标识的稍微棘手的问题。 (理论上,您可以拥有由不同类加载器加载的具有相同全名的多种类型。我认为您需要在类加载器中“快速而宽松地”来使用原始包装类来做到这一点......但是我觉得还是有可能的。)

关于java - 如何从 String 转换为原始类型或标准 java 包装类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24982487/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com