2010-01-07 13 views
6

मैं तारों से वस्तुओं को पार्स करने के लिए एक सामान्य विधि लिखने की कोशिश कर रहा हूं। स्पष्ट होने के लिए, मेरे पास निम्नलिखित गैर-सुरुचिपूर्ण कार्यान्वयन है:जावा में स्ट्रिंग से पार्सिंग ऑब्जेक्ट्स

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

उत्तर

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 लगभग वही सुझाव देने जा रहा था। उनके पास स्ट्रिंग लेने वाले सभी निर्माता हैं। – BalusC

8

मुझे यकीन नहीं है कि आप क्या करने की कोशिश कर रहे हैं। यहां कुछ अलग अनुमान हैं:

  • आप किसी ऑब्जेक्ट को स्ट्रिंग में परिवर्तित करने में सक्षम होना चाहते हैं, और इसके विपरीत।

आपको क्रमबद्धरण में देखना चाहिए। मैं XStream का उपयोग करता हूं, लेकिन writeObject और java.beans.XMLEncoder भी काम करता है।

  • उपयोगकर्ता पाठ में प्रवेश करता है, और आप इसे "दाएं" प्रकार पर समन्वयित करना चाहते हैं, जिसमें से कई हैं।

आमतौर पर, इसका मतलब उपयोगकर्ता विनिर्देश के साथ एक समस्या है। आप उपयोगकर्ता से क्या प्राप्त कर रहे हैं, और यह इतने सारे अलग-अलग प्रकार क्यों हो पाएगा?

सामान्य रूप से, आप चाहते हैं कि प्रकार जितना संभव हो उतना व्यापक हो: double का उपयोग करें यदि यह संख्या है, और String लगभग बाकी सब कुछ के लिए। फिर उस चर से अन्य चीजें बनाएं। लेकिन इस प्रकार में पास न करें: आमतौर पर, प्रकार बहुत स्पष्ट होना चाहिए।

+1

+1 - मुझे संदेह है कि ओपी गलत समस्या को हल करने का प्रयास कर रहा है। –

1

NumberUtils.createNumber(str) (से Apache Commons-लैंग)

यह संख्या किस प्रकार बनाने के लिए ताकि आप कक्षा में उत्तीर्ण नहीं होते फैसला करता है।

2

enums के बारे में कैसे?

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

अधिक जानकारी के सही उत्तर के लिए उपलब्ध करा सकता है:

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

यह डाउनवॉट क्यों किया गया ??? – pgras

+0

डुनो; प्रकार टोकन के लिए +1। यह 'संख्या' वापस करने और बाध्य वाइल्डकार्ड प्रकार,' कक्षा <निर्दिष्ट करने के लिए भी दिलचस्प हो सकता है? संख्या> 'बढ़ाता है। – trashgod

0

तो उन उदाहरण के अपने ही प्रकार के होते हैं, तो आप भी कुछ ऐसा कर सकते हैं। अगर आपके पास पहले से ही कुछ उपयोगिता कोड नहीं हैं जो आपके विनिर्देशों को पूरा करते हैं तो मैं बहुत आश्चर्यचकित हूं। वास्तविक आवश्यकताओं के आधार पर इस समस्या से निपटने के कुछ तरीके हैं।

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); 
संबंधित मुद्दे