एक बहुत ही अमूर्त स्तर पर मुझे पता है कि रैपर वर्ग, आदिम डेटा प्रकार का एक वस्तु बनाते हैं, लेकिन मुझे उत्सुकता है कि हमें रैपर वर्गों का उपयोग करने की आवश्यकता क्यों है और क्या फायदे हैं वे आदिम डेटा प्रकारों की पेशकश करते हैं।जावा में प्राइमेटिव्स पर रैपर वर्गों का उपयोग करने के लाभ
उत्तर
पहले स्थान पर संग्रह, उदाहरण के लिए, List<Integer>
, आप यहां आदिम int
का उपयोग नहीं कर सकते हैं। वास्तव में किसी भी सामान्य वर्ग/इंटरफेस है कि विभिन्न प्रकार के साथ वस्तु की तरह
public interface Callable<V> {
V call() throws Exception;
}
ध्यान दें कि रैपिंग सबसे अच्छा कैश का उपयोग करने की कोशिश करेंगे नहीं नई पूर्णांक (i) लेकिन Integer.valueOf (i) उत्तरार्द्ध का उपयोग किया जाता काम कर सकते हैं। Unwrapping Integer.intValue() के रूप में किया जाता है। पुरातन के इन रैपिंग/unwrapping
list.add(Integer.valueIf(1));
int i = list.get(0).intValue(); // this is where NullPointerException sometimes happens
एक रैपर प्रकार एक आदिम को अधिक प्रासंगिक अर्थ रखने में सक्षम बनाता है। उदाहरण के लिए एक पूर्णांक कुछ भी हो सकता है, जबकि घंटे कहा जाता है, उदाहरण के लिए, जहां भी इसका उपयोग किया जाता है, वहां नंबर का अर्थ देता है।
वे उन तरीकों को भी सक्षम करते हैं जो उपभोक्ताओं को लगातार और स्पष्ट तरीके से कहा गया है। इस बिंदु के आस-पास की अधिक जानकारी के लिए Domain Driven Design पर एक नज़र डालें।
तो होगा यह कहना पर्याप्त है कि रैपर आदिम डेटा प्रकार, पर कोई बेहतर प्रदर्शन प्रदान नहीं करता है, यह केवल डेटा प्रकार के प्रासंगिक अर्थ जोड़ता है? – veepsk
में तो ठेठ कार्य है कि जावा 5 पेश किया autoboxing/
List<Integer> list = new ArrayList<>();
list.add(1);
int i = list.get(0);
इस कोड को स्वचालित रूप से जावा संकलक द्वारा परिवर्तित किया जाता है unboxing हैं आदिम प्रकार बस मूल्य पकड़, आवरण वर्ग यह एक नाम देता है।
कक्षा के नाम के साथ, कंपाइलर आपके लिए कुछ स्थिर जांच कर सकता है। यह इंटरफेस को और अधिक सार्थक बनाता है। और आप प्राचीन मूल्यों को सत्यापित करने के लिए रैपर वर्गों में कुछ विधि भी परिभाषित कर सकते हैं।
आम तौर पर, एक छोटी परियोजना के लिए, मुझे लगता है कि आदिम प्रकार का उपयोग ठीक है।
रैपर ऑब्जेक्ट सामान्य वस्तुएं हैं और संदर्भ null
हो सकते हैं। यह "सेट नहीं" राज्य के उपयोग की अनुमति देता है जो प्राइमेटिव के साथ असंभव है।
Integer no = null; // not set
आपको एक जादू मान का उपयोग करना होगा जैसे कि एक आदिम चर "अनसेट" है।
रैपर कक्षाएं आदिम प्रकारों को और अधिक कार्यक्षमता जोड़ने के लिए डिज़ाइन की गई हैं, ताकि वे संग्रह फ्रेमवर्क का उपयोग करके जेनेरिक कोड के साथ संगत हों और कई अन्य लाभ। हालांकि, वे आदिम प्रकारों को प्रतिस्थापित करने के लिए नहीं हैं।
तो, जब आवश्यक हो, आपको जेनरिक्स से निपटने के दौरान केवल रैपर का उपयोग करना चाहिए, क्योंकि ऑब्जेक्ट बनाना आपके प्रोग्राम में पर्याप्त ओवरहेड जोड़ता है। तो, सामान्य मामलों में, आपको primitives के साथ रहना चाहिए।
बस कल्पना करें: आप एक गेम खेल रहे हैं जिसमें आपको स्थिति को सहेजने की ज़रूरत है और आप अलग-अलग कंप्यूटर (एक ही गेम) में खेलना चाहते हैं तो आपने दूसरे कंप्यूटर पर स्थिति (स्तर) लेने का फैसला किया है, तो आप उस से जारी रख सकते हैं राज्य (शुरुआत से नहीं) .. अगर आपके वर्तमान हथियार की स्थिति 3 है तो ठीक है प्रश्नों के लिए 3. जैसे {int हथियार = 1; अगर (आप कुछ स्तरों को खेलकर हथियार जोड़ते हैं तो ठीक है 3)} लेकिन आप इसे ऑब्जेक्ट के रूप में स्टोर करने में सक्षम नहीं हैं क्योंकि प्राइमेटिव अलग हैं। (स्टैक में रहता है)।इसलिए आपको ऑब्जेक्ट्स के रूप में हथियारों की आवश्यकता है ((समाधान: इंटीजर ऑब्जेक्ट बनाएं)) इंटीजर हथियार = नया इंटीजर (1) {...}
आप http://stackoverflow.com/questions/1570416/ पर एक नज़र डाल सकते हैं जब-टू-यूज-रैपर-क्लास-एंड-प्राइमेटिव-टाइप और http://stackoverflow.com/questions/2509025/when-to-use-primitive-and-when-reference-types-in-java – Swapnil