Парсинг объектов от строки в Java

Я пытаюсь записать общий метод проанализировать объекты от строк. Чтобы быть ясным, у меня есть следующая not-so-elegant реализация:

public static Object parseObjectFromString(String s, Class class) throws Exception {
  String className = class.getSimpleName();
  if(className.equals("Integer")) {
    return Integer.parseInt(s);
  }
  else if(className.equals("Float")) {
    return Float.parseFloat(s);
  }
  else if ...

}

Существует ли лучший способ реализовать это?

7
задан Delip 7 January 2010 в 06:16
поделиться

6 ответов

Ваш метод может иметь одну линию кода:

public static <T> T parseObjectFromString(String s, Class<T> clazz) throws Exception {
    return clazz.getConstructor(new Class[] {String.class }).newInstance(s);
}

тестирование с разными классами:

Object obj1 = parseObjectFromString("123", Integer.class);
System.out.println("Obj: " + obj1.toString() + "; type: " + obj1.getClass().getSimpleName());
BigDecimal obj2 = parseObjectFromString("123", BigDecimal.class);
System.out.println("Obj: " + obj2.toString() + "; type: " + obj2.getClass().getSimpleName());
Object obj3 = parseObjectFromString("str", String.class);
System.out.println("Obj: " + obj3.toString() + "; type: " + obj3.getClass().getSimpleName());
Object obj4 = parseObjectFromString("yyyy", SimpleDateFormat.class);
System.out.println("Obj: " + obj4.toString() + "; type: " + obj4.getClass().getSimpleName());

Выход:

Obj: 123; type: Integer
Obj: str; type: String
Obj: 123; type: BigDecimal
Obj: java.text.SimpleDateFormat@38d640; type: SimpleDateFormat
12
ответ дан 6 December 2019 в 07:26
поделиться

Если это ваши единственные типы примеров, то вы также можете сделать что-то вроде:

Constructor ctor = Class.getConstructor( String.class ); 
return ctor.newInstance( s );

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

.
0
ответ дан 6 December 2019 в 07:26
поделиться

Я не уверен, что ты пытаешься сделать. Вот несколько разных догадок:

  • Вы хотите иметь возможность конвертировать объект в строку, и наоборот.

Вы должны обратить внимание на сериализацию. Я использую XStream, но writeObject и java.beans.XMLEncoder также работает.

  • Пользователь вводит текст, и вы хотите принудить его к "правильному" типу, которых много.

Обычно это означает проблему со спецификацией пользователя. Что вы получаете от пользователя, и почему оно может быть такого количества различных типов?

В общем, вы хотите, чтобы тип был как можно более широким: используйте double, если это число, и String почти для всего остального. Затем соберите остальные вещи из этой переменной. Но не передавайте в типе: обычно тип должен быть очень очевиден.

.
8
ответ дан 6 December 2019 в 07:26
поделиться

Как насчет enums?

  public enum Types {

     INTEGER {
        @Override
        public Object parse(String s) { return Integer.parseInt(s); }
     },
     FLOAT {
        @Override
        public Object parse(String s) { return Float.parseFloat(s); } 
     }
     ...
     ;

     public abstract Object parse(String s);

     public static Object parseObjectFromString(String s, Class<?> cls)  {
        return valueOf(cls.getSimpleName().toUpperCase()).parse(s);
     }
  }

  public static void main(String[] args) {
     System.out.println(Types.parseObjectFromString("5", Integer.class));
  }
3
ответ дан 6 December 2019 в 07:26
поделиться

NumberUtils.createNumber(str) (из apache commons-lang)

Решает, какой тип числа создавать, поэтому класс не передается.

1
ответ дан 6 December 2019 в 07:26
поделиться

Для преобразования от объекта (здесь строка) к другому можно использовать Трансмиф :

Transmorph transmorph = new Transmorph(new DefaultConverters());
float myFloat = transmorph.convert("55.2",Float.TYPE);

long[] longsArray = transmorph.convert(new Integer[] { 1, 2, 3, 4 }, long[].class);
0
ответ дан 6 December 2019 в 07:26
поделиться
Другие вопросы по тегам:

Похожие вопросы: