2011-07-13 18 views
10

एक साधारण डिजाइन सवाल।क्यों BinaryString इंटीजर क्लास में एक उदाहरण विधि नहीं है?

नमूना कोड:

Integer int1 = new Integer(20);  
    System.out.println(Integer.toBinaryString(int1)); 

क्यों JDK डिजाइन निम्नलिखित की तरह कुछ नहीं है? तो, toBinaryString फ़ंक्शन वांछित परिणाम देता है?

System.out.println(int1.toBinaryString()); 

एक स्थिर समारोह की व्यापक उपयोगिता के लिए एक तरफ, इस डिजाइन दृष्टिकोण के लिए अन्य कारणों क्या हैं? क्या वे किसी विशेष डिजाइन पैटर्न का उपयोग कर रहे हैं? यदि यह तो है, तो कौन सा पैटर्न?

उत्तर

9

आपका नमूना कोड Integer का एक उदाहरण बनाता है और फिर इसे अनबॉक्स करता है।

int int1 = 20; 
String binary = Integer.toBinaryString(int1); 

यदि यह एक उदाहरण विधि थे, तो आप मजबूरInteger का एक उदाहरण बनाने के लिए पूरी तरह से अपने द्विआधारी प्रतिनिधित्व है, जो कष्टप्रद होगा करने के लिए एक int कन्वर्ट करने के लिए होगा: उस के लिए कोई ज़रूरत नहीं है।

दूसरे शब्दों में: अनावश्यक रूप से वस्तुओं को बनाने से बचने के लिए।

+0

* स्पष्ट रूप से * वस्तुओं को अनावश्यक रूप से बनाने से बचने के लिए, नहीं? Autoboxing किसी भी मामले में अनिवार्य रूप से समान बाइटकोड बनाने समाप्त हो जाएगा।(अब, हॉटस्पॉट ऑब्जेक्ट सृजन को पूरी तरह से बढ़ा सकता है, लेकिन फिर से यह दोनों मामलों पर समान रूप से लागू होगा)। या क्या मैं कुछ न कुछ भूल रहा हूं? –

+0

@ जोन-स्कीट बस कहता है कि 'int' प्रकार मौजूद नहीं है। तो इस डिजाइन पैटर्न के पीछे क्या कारण होगा? –

+1

एंड्रज: नहीं, कोई ऑटोबॉक्सिंग नहीं होगी, क्योंकि पैरामीटर टाइप 'int',' इंटीजर 'नहीं है। –

15

ऐसा इसलिए है क्योंकि आपके पास एक ही नाम, एक स्थिर और एक उदाहरण के साथ दो विधियां नहीं हो सकती हैं। एक ही कार्यक्षमता के लिए दो अलग-अलग विधि नाम होने से भ्रमित हो रहा होगा।

एक स्थिर विधि में लाना अधिक तार्किक के बाद से उस मामले में आप अपने द्विआधारी प्रतिनिधित्व होने से पहले एक पूर्णांक में एक पूर्णांक "रैप" करने की जरूरत नहीं होगी लग रहा था और यह (int के लिए और Integer के लिए बाइनरी स्ट्रिंग) दोनों उद्देश्यों को पूरा करती ।

+0

मुझे पता है। मेरा सवाल यह है कि इस तरह से जेडीके डिज़ाइन किया गया है। –

+0

मैंने पहले ही इसका उत्तर दिया है; ऐसा इसलिए है क्योंकि आपको 'int' को' इंटीजर 'में लपेटने की आवश्यकता नहीं है और कक्षा में दो विधियों (एक स्थिर और एक नहीं) को रोकने के लिए भी एक ही चीज़ करनी है। –

+0

+1 मुझे संदेह है कि यह उत्तर है - क्योंकि 'int' एक ऑब्जेक्ट नहीं है, लेकिन ऑटोबॉक्सिंग आपको यह दिखाता है कि यह एक तरीका है * * एक विधि * पास * (लेकिन उस पर एक विधि का आह्वान करते समय)। 'Integer.toBinaryString (42) 'संकलित करता है, लेकिन' 42.toBinaryString() 'नहीं करता है। –

6

जब यह विधि जोड़ा गया था, जेडीके 1.0.2 में, कोई ऑटोबॉक्सिंग नहीं थी, और JVMs अब से बहुत धीमे थे। मुझे कल्पना है कि इस स्थैतिक विधि को एक int और इंटीजर को बाइनरी स्ट्रिंग में आसानी से परिवर्तित करने की इजाजत दी गई है, और बाइनरी के int के रूपांतरण के लिए एक नया इंटीजर इंस्टेंस बनाने के बिना।

0

int, char, double ... ये डिफ़ॉल्ट डेटाटाइप हैं, ये ऑब्जेक्ट नहीं हैं। विधि किसी ऑब्जेक्ट का हिस्सा नहीं होना चाहिए डेटाटाइप।

ऐसी स्थिर विधि उदाहरण विधि से अधिक कुशल है।

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