2013-03-06 7 views
5

सुनिश्चित नहीं है कि मैं इसे सही तरीके से कह रहा हूं। अगर आपको अधिक जानकारी की आवश्यकता है तो कृपया मुझे बताएं। हमारे पास एक आवश्यकता है जहां हमें सिस्टम पर्यावरण चर के आधार पर चर के प्रकार को निर्धारित करने की आवश्यकता है।संकलित समय में प्राइमेटिव चर प्रकार

तो, कहते हैं कि हम एक के बाद वर्ग

class Test 
{ 
    DUMMY_TYPE testVariable; 
} 

DUMMY_TYPE एक प्रणाली चर के आधार पर निर्धारित किया गया है। तो जब जावा संकलित करता है, तो क्या जावा को संकलन प्रकार के प्रकार को निर्धारित करने के लिए सिस्टम पर्यावरण चर का उपयोग करना संभव है?

साथ ही, यह किसी भी तरह से ग्रहण पर सेट करना संभव है, जहां ग्रहण मुझे आईडीई पर मुझे DUMMY_TYPE दिखाएगा, जहां भी मैं इसका उपयोग करता हूं, लेकिन संकलन और निर्माण करते समय, DUMMY_TYPE को पर्यावरण चर के आधार पर सही प्रकार के साथ प्रतिस्थापित कर सकता है ?

+0

कूल सवाल। जिज्ञासा के लिए, क्या आप मुझे यह पूछते हैं कि इसके लिए उपयोग का क्या मामला है? – asteri

+7

संक्षेप में जवाब नहीं है, लेकिन यह जानने के बिना कि आप क्या करने का प्रयास कर रहे हैं, यह जानना मुश्किल है कि कोई उचित विकल्प है या नहीं। –

+0

यह एक एपीआई का हिस्सा है जिसका उपयोग आंतरिक रूप से किया जाता है और सॉकेट के माध्यम से एक मालिकाना प्रणाली के साथ बातचीत करता है। आंतरिक प्रणाली एक ही चर के लिए एक पूर्णांक या डबल स्ट्रीम कर सकते हैं। यह पर्यावरण चर का उपयोग कर उस का दृढ़ संकल्प करता है। तो संकलन समय पर अलग कोड आधार बनाए रखने के बजाय, अगर हम इसे निर्धारित कर सकते हैं, तो बहुत सारे सिरदर्द बचाएंगे :)। हम इसे सी ++ और सी # में प्राप्त करने में सक्षम थे, लेकिन जावा हमें कुछ दुःख दे रहा है। – Karthik

उत्तर

1

मुझे एक विचार है।

प्रकार Object (या एक DummyType वर्ग जो Object फैली) की testVariable करें। फिर आप अपने सिस्टम वैरिएबल से जो पढ़ते हैं उसके आधार पर आप वैरिएबल रैपर क्लासेस का उपयोग करके इच्छित डेटा को वैरिएबल लोड कर सकते हैं।

तो:

public class Test { 

    Object testVariable; 

    { 
     String whichType = null; 

     //Logic to read your system variable from wherever and store it in whichType 

     if(whichType.equals("int")) { 
      testVariable = new Integer(intVal); 
     } 
     else if(whichType.equals("double")) { 
      testVariable = new Double(doubleVal); 
     } 
     //etc. 
    } 
बेशक

, यह जावा है "पता लगाना" जो टाइप यह संकलन समय पर है की तरह आप चाहते हैं, जरूरी (और असाइनमेंट रन टाइम पर जगह ले जाएगा, जब Test ऑब्जेक्ट बनाया गया था), लेकिन यह एक विकल्प के लिए उचित ढांचे की तरह लगता है।

और आप testVariable के मूल्य को प्रारंभिक रूप से प्रारंभिक रूप से प्रारंभिक रूप से भी सेट कर सकते हैं।

वैकल्पिक रूप से, अगर आप इस तरह एक तरीका है जिसके एक String के रूप में आदानों स्वीकार करता है हो सकता है (आपके सिस्टम चर से पढ़ें) और आदिम प्रकार के उपयुक्त आवरण वर्ग में यह रिटर्न:

public Object getPrimitiveValue(String type, String value) { 
    if(type.equals("int")) { 
     return new Integer(Integer.parseInt(value)); 
    } 
    else if(type.equals("double")) { 
     return new Double(Double.parseDouble(value)); 
    } 
    //etc. 
} 
+0

यह पूछा जा रहा है कि एक उचित अनुमान की तरह लगता है। साथ ही, चूंकि प्रकार या तो 'इंटीगर' या 'डबल' है, इसलिए सुपरक्लास 'ऑब्जेक्ट 'की बजाय' संख्या' हो सकता है। –

+0

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

+0

@ user1524088 तथ्य यह है कि वे आदिम संस्करणों को स्वीकार करते हैं, ऑटो-अनबॉक्सिंग के कारण या 'इंटेगर' (और सभी रैपर वर्गों की तरह) की स्पष्ट रूप से 'intValue()' विधि का आविष्कार करने के कारण कोई समस्या नहीं होनी चाहिए। – asteri

संबंधित मुद्दे