Общий код для преобразования String в любой желаемый класс - PullRequest
2 голосов
/ 30 января 2012

Мне нужно код метода, что-то вроде:

MyClassObject convert(Class MyClass , String value)

Задача метода convert - преобразовать String в объект MyClass, где MyClass может быть чем угодно (кроме примитива) - Integer, Boolean, Character, Date ... здесь огромные возможности - вот почему я отказался от моего глупого блока if-else для индивидуальной обработки всех случаев.

Я мог видеть что-то связанное с этим для C # (не знаю, работает ли он), не знаю, есть ли у нас Java-эквивалент для this или this

Я понимаю, что не все можно преобразовать из строки, я готов обработать исключения для непарсируемых элементов.

Я не знаю, возможно ли это или нет. Если нет, пожалуйста, помогите мне с правильным шаблоном дизайна для моего кода.

Спасибо!

Ответы [ 2 ]

3 голосов
/ 16 апреля 2012

Ваш лучший выбор, вероятно, - механизм ServiceLoader.Это позволяет вам определить пару интерфейсов, например:

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

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

..., а затем найти все реализации этих интерфейсов, доступных во время выполнения, например:

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;
}

Youсделайте вашу реализацию интерфейсов доступной для ServiceLoader, перечислив их в специальный файл в каталоге META-INF в вашем файле jar;см. Javadoc для деталей.

2 голосов
/ 30 января 2012

Используя отражение и надеясь, что все объекты-оболочки для примитивов содержат конструктор со строковым аргументом для значения, вы можете добиться этого, как показано ниже:

// A sample test with main
public static void main(String[] args) {
    Object obj = create(Integer.class, "54896");
    Integer val = (Integer) obj;
    System.out.println(val);
}

// Method to create the desired object with the given value
private static Object create(Class myClass, String value) {
    Object obj = null;
    try {
        Constructor constructor = myClass.getConstructor(new Class[]{String.class});
        obj=constructor.newInstance(value);
    } catch (SecurityException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (NoSuchMethodException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalArgumentException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InstantiationException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    } catch (InvocationTargetException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }
    return obj;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...