2010-01-07 5 views
6

J'essaie d'écrire une méthode générale pour analyser des objets à partir de chaînes. Pour être clair, j'ai la mise en œuvre suivante pas si élégant:Analyse d'objets à partir d'une chaîne en Java

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 ... 

} 

Existe-t-il une meilleure façon de mettre en œuvre cela?

+0

Veuillez ajouter le contexte dans lequel vous souhaitez utiliser la méthode. Cela aiderait à donner une bonne solution. – helios

Répondre

12

Votre méthode peut avoir une seule ligne de code:

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

test avec différents classes:

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()); 

La sortie:

Obj: 123; type: Integer 
Obj: str; type: String 
Obj: 123; type: BigDecimal 
Obj: [email protected]; type: SimpleDateFormat 
+0

+1 allait suggérer à peu près la même chose. Ils ont tous un constructeur qui prend une corde. – BalusC

8

Je ne suis pas sûr de ce que vous essayez de faire. Voici quelques suppositions différentes:

  • Vous souhaitez pouvoir convertir un objet en chaîne, et inversement.

Vous devriez vous pencher sur la sérialisation. J'utilise XStream, mais writeObject et java.beans.XMLEncoder fonctionne également.

  • L'utilisateur entre du texte et vous voulez le contraindre au type "droit", dont il existe plusieurs.

Habituellement, cela signifie un problème avec la spécification de l'utilisateur. Qu'est-ce que vous recevez de l'utilisateur, et pourquoi serait-il en mesure d'être si différents types?

En général, vous voulez que le type soit aussi large que possible: utilisez double s'il s'agit d'un nombre et String pour presque tout le reste. Ensuite, construisez d'autres choses à partir de cette variable. Mais ne passez pas dans le type: généralement, le type devrait être très évident.

+1

+1 - Je soupçonne que l'OP essaye de résoudre le mauvais problème. –

2

Que diriez-vous d'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)); 
    } 
+0

Pourquoi était-ce downvoted ??? – pgras

+0

Dunno; +1 pour le jeton de type. Il peut également être intéressant de renvoyer 'Number' et de spécifier un type générique délimité,' Class '. – trashgod

0

Si ce sont vos seuls types d'exemples, vous pouvez aussi faire quelque chose comme:

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

Plus d'informations peuvent fournir de meilleures réponses. Je serais très surpris s'il n'y a pas déjà un code d'utilité répondant à vos spécifications. Il existe plusieurs façons d'aborder ce problème en fonction des besoins réels.

0

Pour convertir un objet (ici une chaîne) à un autre, vous pouvez utiliser transmorph:

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