java - 将 String 转换为任何所需类的通用代码

标签 java generics design-patterns reflection

我需要编写一个方法,例如:

MyClassObject convert(Class MyClass , String value)

convert 方法的工作是将 String 转换为 MyClass 的对象,其中 MyClass 可以是任何东西(除了原语) - 整数、 boolean 值、字符、日期...这里的可能性是巨大的 - 这就是我的原因放弃了我愚蠢的 if-else block 来单独处理所有情况。

我可以看到与此相关的 C# 内容(不知道它是否有效),不知道我们是否有 this 的 Java 等效项或this

我知道并非所有内容都可以从字符串转换,我已准备好处理不可解析项目的异常。

我不知道这是否可能。如果没有,请帮助我为我的代码制定正确的设计模式。

谢谢!

最佳答案

您最好的选择可能是 ServiceLoader机制。这允许您定义一对接口(interface),例如:

interface StringConverterProvider{
    StringConverter<T> getConverterFor(Class<T> clazz);
}

interface StringConverter<T>{
    T convert(String s);
}

...然后找到运行时可用的这些接口(interface)的所有实现,如下所示:

ServiceLoader<StringConverterProvider> converterProviderLoader
    = ServiceLoader.load(StringConverterProvider.class);

T convert(String s, Class<T> t){
    for(StringConverterProvider scProv : converterProviderLoader){
        StringConverter<T> converter = scProv.getConverterFor(t);
        if (converter != null)
            return converter.convert(s);
        }
    return null;
}

您可以通过在 jarMETA-INF 目录中的一个特殊文件中列出接口(interface)的实现来供 ServiceLoader 使用文件;有关详细信息,请参阅 javadoc。

关于java - 将 String 转换为任何所需类的通用代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9067040/

相关文章:

java - 是否可以在不使用其他库的情况下连接到 SFTP 存储库?

swift - 'T' 类型的值没有动态成员 'object' 使用来自根类型 'T' 的 key 路径

ios - 沿路径绘制图案

design-patterns - 使用 ServiceStack 在 "per object per user"基础上控制权限的最佳设计模式?

java - 当参数类型在 postgresql 中是 "timestamp without time zone"时,Java 中的参数类型应该是什么?

java - 获取 "cannot activate web view"

java - 在 Web 项目中定义一组常量的最佳方法是什么?

c# - 创建 Type<SuperClass> 的通用列表并用派生类填充它的解决方法?

scala - 使用泛型进行 Doobie 批量更新

c# - 我的 DAL 应该返回 Person 还是 Datatable?