Я пытаюсь записать общий метод проанализировать объекты от строк. Чтобы быть ясным, у меня есть следующая 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 ...
}
Существует ли лучший способ реализовать это?
Ваш метод может иметь одну линию кода:
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
Если это ваши единственные типы примеров, то вы также можете сделать что-то вроде:
Constructor ctor = Class.getConstructor( String.class );
return ctor.newInstance( s );
Больше информации может дать лучшие ответы. Я был бы очень удивлен, если бы уже не было кода утилиты, который бы соответствовал вашим спецификациям. Есть несколько способов решения этой проблемы в зависимости от реальных требований.
.Я не уверен, что ты пытаешься сделать. Вот несколько разных догадок:
Вы должны обратить внимание на сериализацию. Я использую XStream, но writeObject и java.beans.XMLEncoder также работает.
Обычно это означает проблему со спецификацией пользователя. Что вы получаете от пользователя, и почему оно может быть такого количества различных типов?
В общем, вы хотите, чтобы тип был как можно более широким: используйте double
, если это число, и String
почти для всего остального. Затем соберите остальные вещи из этой переменной. Но не передавайте в типе: обычно тип должен быть очень очевиден.
Как насчет 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));
}
NumberUtils.createNumber(str)
(из apache commons-lang)
Решает, какой тип числа создавать, поэтому класс не передается.
Для преобразования от объекта (здесь строка) к другому можно использовать Трансмиф :
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);