2010-01-07 49 views
6

我想寫一個通用的方法來解析字符串中的對象。要清楚,我有以下不那麼優雅的實現:從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 ... 

} 

有沒有更好的方式來實現這個?

+0

請添加您想要使用該方法的上下文。這將有助於提供適當的解決方案。 – helios 2010-01-19 11:24:52

回答

12

你的方法可以有一個單一的代碼行:

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: [email protected]; type: SimpleDateFormat 
+0

+1會提示大致相同。他們都有一個構造函數接受一個String。 – BalusC 2010-01-19 12:15:34

8

我不確定你想要做什麼。以下是幾個不同的猜測:

  • 您希望能夠將對象轉換爲字符串,反之亦然。

你應該看看序列化。我使用XStream,但writeObjectjava.beans.XMLEncoder也有效。

  • 用戶輸入文本,並且您希望將其強制爲「正確」類型,其中有很多。

通常,這意味着用戶規格有問題。你從用戶那裏得到了什麼,爲什麼它能夠有這麼多種不同的種類?

一般而言,您會希望類型儘可能寬:如果是數字,請使用double;對於幾乎所有其他類型,請使用String。然後從這個變量中構建其他東西。但不要傳入類型:通常,類型應該非常明顯。

+1

+1 - 我懷疑OP是在試圖解決錯誤的問題。 – 2010-01-07 07:29:42

2

枚舉怎麼樣?

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

這是爲什麼downvoted? – pgras 2010-01-07 12:08:46

+0

Dunno;類型令牌+1。返回'Number'並指定一個有界的通配符類型'Class <?擴展Number>'。 – trashgod 2010-01-07 15:52:10

0

如果這些是你唯一類型的例子,那麼你也可以這樣做:

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

更多的信息可以提供更好的答案。如果沒有符合您的規範的實用程序代碼,我會非常驚訝。根據實際要求,有幾種方法可以解決這個問題。

0

從對象(這裏是一個字符串)到另一個轉換,你可以使用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);