इसके लायक होने के लिए, अधिकांश स्क्रिप्टिंग भाषाएं (जैसे पर्ल) और गैर-स्थिर संकलन-समय वाली भाषाएं (जैसे पिक) स्वचालित रन-टाइम डायनामिक स्ट्रिंग टू (अपेक्षाकृत मनमाना) ऑब्जेक्ट रूपांतरण का समर्थन करती हैं। यह जावा में और साथ ही टाइप-सेफ्टी खोए बिना पूरा किया जा सकता है और अच्छी तरह से स्टैटिकली टाइप की गई भाषाएं डायनेमिक कास्टिंग के साथ बुरी चीजें करने वाली कुछ अन्य भाषाओं के बुरे साइड-इफेक्ट्स के बिना प्रदान करती हैं। एक पर्ल उदाहरण जो कुछ संदिग्ध गणित करता है:
print ++($foo = '99'); # prints '100'
print ++($foo = 'a0'); # prints 'a1'
जावा में, यह बेहतर तरीका है जिसे मैं "क्रॉस-कास्टिंग" कहता हूं। क्रॉस-कास्टिंग के साथ, प्रतिबिंब का उपयोग निर्माणकर्ताओं की एक आलसी-भरी हुई कैश में किया जाता है और विधियाँ जिन्हें निम्नलिखित स्थिर विधि के माध्यम से गतिशील रूप से खोजा जाता है:
Object fromString (String value, Class targetClass)
दुर्भाग्यवश, कोई अंतर्निहित जावा विधियाँ जैसे कि Class.cast () स्ट्रिंग के लिए BigDecimal या String to Integer या कोई अन्य रूपांतरण नहीं होगा जहाँ कोई सहायक वर्ग पदानुक्रम नहीं है। मेरे हिस्से के लिए, यह हासिल करने के लिए पूरी तरह से गतिशील तरीका प्रदान करना है - जिसके लिए मुझे नहीं लगता कि पूर्व संदर्भ सही दृष्टिकोण है - प्रत्येक रूपांतरण को कोड करने के लिए। सीधे शब्दों में कहें, तो कार्यान्वयन केवल कास्ट-से-स्ट्रिंग करने के लिए है यदि यह कानूनी / संभव है।
तो समाधान सरल प्रतिबिंब है या तो सार्वजनिक सदस्यों की तलाश में:
STRING_CLASS_ARRAY = (नया वर्ग [] {String.class});
a) सदस्य सदस्य = targetClass.getMethod (method.getName) (, STRING_CLASS_ARRAY); b) सदस्य सदस्य = targetClass.getConstructor (STRING_CLASS_ARRAY);
आप पाएंगे कि सभी प्राइमेटिव्स (इंटेगर, लॉन्ग आदि) और सभी बेसिक्स (बिगइन्टेगर, बिगडेसिमल, इत्यादि) और यहां तक कि java.regex.Pattern सभी इस दृष्टिकोण से कवर किए गए हैं। मैंने उत्पादन परियोजनाओं पर महत्वपूर्ण सफलता के साथ इसका उपयोग किया है जहां भारी मात्रा में मनमाने ढंग से स्ट्रिंग मूल्य इनपुट हैं जहां कुछ और सख्त जाँच की आवश्यकता थी। इस दृष्टिकोण में, अगर कोई विधि नहीं है या जब विधि का आह्वान किया जाता है तो एक अपवाद को फेंक दिया जाता है (क्योंकि यह एक गैर-संख्यात्मक इनपुट के लिए एक गैर-संख्यात्मक इनपुट है जैसे पैटर्न के लिए), जो चेकिंग को विशिष्ट प्रदान करता है लक्ष्य वर्ग निहित तर्क।
इसके कुछ डाउनसाइड हैं:
1) आपको प्रतिबिंब को अच्छी तरह से समझने की आवश्यकता है (यह थोड़ा जटिल है और नौसिखियों के लिए नहीं)। 2) जावा कक्षाओं में से कुछ और वास्तव में 3-पार्टी पुस्तकालय (आश्चर्य) ठीक से कोडित नहीं हैं। यही है, ऐसे तरीके हैं जो इनपुट के रूप में एकल स्ट्रिंग तर्क लेते हैं और लक्ष्य वर्ग का एक उदाहरण देते हैं लेकिन ऐसा नहीं है जो आप सोचते हैं ... पूर्णांक वर्ग पर विचार करें:
static Integer getInteger(String nm)
Determines the integer value of the system property with the specified name.
उपरोक्त विधि का वास्तव में इंटिजर्स के साथ कोई लेना-देना नहीं है क्योंकि ऑब्जेक्ट्स आदिम स्याही को लपेटते हैं। प्रतिबिंब इसे एक संभावित उम्मीदवार के रूप में एक स्ट्रिंग से एक पूर्णांक बनाने के लिए गलत तरीके से डिकोड, मान और निर्माता सदस्य के रूप में मिलेगा - जो सभी सबसे मनमाने ढंग से स्ट्रिंग रूपांतरणों के लिए उपयुक्त हैं, जहां वास्तव में आपके इनपुट डेटा पर नियंत्रण नहीं है, लेकिन आप चाहते हैं पता है कि यह एक पूर्णांक संभव है।
इसके बाद के संस्करण में सुधार करने के लिए, तरीकों कि अपवाद फेंक की तलाश में एक अच्छी शुरुआत है, क्योंकि अमान्य इनपुट मूल्यों है कि इस तरह की वस्तुओं के उदाहरण बना होना चाहिए अपवाद फेंक देना । दुर्भाग्य से, कार्यान्वयन अलग-अलग होते हैं चाहे अपवाद घोषित किए गए हों या नहीं। Integer.valueOf (स्ट्रिंग) उदाहरण के लिए एक चेक किए गए नंबरफ़ॉर्मैट अपवाद को फेंकता है, लेकिन प्रतिबिंब देखने के दौरान Pattern.compile () अपवाद नहीं पाए जाते हैं। फिर से, इस गतिशील "क्रॉस-कास्टिंग" दृष्टिकोण का विफल होना मुझे लगता है कि ऑब्जेक्ट निर्माण विधियों में अपवाद घोषणाओं के लिए एक बहुत ही गैर-मानक कार्यान्वयन है।
अगर किसी को यह अधिक जानकारी चाहिए कि ऊपर कैसे लागू किया गया था, तो मुझे बताएं लेकिन मुझे लगता है कि यह समाधान अधिक लचीला / एक्स्टेंसिबल है और कम कोड के बिना टाइप-सेफ्टी के अच्छे हिस्सों को खो देता है। बेशक "अपने डेटा को जानना" हमेशा सबसे अच्छा होता है, लेकिन जैसा कि हम में से कई लोग पाते हैं, हम कभी-कभी केवल अप्रबंधित सामग्री के प्राप्तकर्ता होते हैं और हमें इसका सही उपयोग करने के लिए सबसे अच्छा करना पड़ता है।
चीयर्स।