जवाबों:
दूसरों ने उल्लेख किया है कि कुछ निर्माण जैसे कि Collections
कि वस्तुओं की आवश्यकता होती है और यह कि वस्तुएं अपने आदिम समकक्षों (मेमोरी और बॉक्सिंग) से अधिक ओवरहेड होती हैं।
एक और विचार है:
राज्य या कार्य को इंगित करने के लिए किसी विधि / निर्माणकर्ता में वस्तुओं को प्रारंभ करना null
या null
पैरामीटर भेजना आसान हो सकता है । यह आदिम के साथ नहीं किया जा सकता है।
कई प्रोग्रामर इसे सूचित करने के लिए संख्याओं को 0 (डिफ़ॉल्ट) या -1 से प्रारंभ करते हैं, लेकिन परिदृश्य के आधार पर, यह गलत या भ्रामक हो सकता है।
यह तब भी दृश्य सेट करेगा NullPointerException
जब कुछ गलत तरीके से उपयोग किया जा रहा है, जो लाइन के नीचे कुछ मनमाने बग की तुलना में बहुत अधिक प्रोग्रामर-अनुकूल है।
आम तौर पर, आपको आदिम प्रकारों का उपयोग करना चाहिए जब तक कि आपको किसी कारण के लिए किसी वस्तु की आवश्यकता न हो (जैसे कि संग्रह में रखना)। फिर भी, एक अलग दृष्टिकोण पर विचार करें, यदि आप संख्यात्मक प्रदर्शन को अधिकतम करना चाहते हैं तो किसी वस्तु की आवश्यकता नहीं है। यह प्रलेखन द्वारा सलाह दी जाती है , और यह लेख दर्शाता है कि ऑटो-बॉक्सिंग एक बड़े प्रदर्शन अंतर का कारण कैसे बन सकता है।
Integer
अधिक से अधिक सुपाठ्य है int
।
मेरी राय में, यदि मेरे वर्ग के सदस्य आवरण चर हैं, तो यह डिफ़ॉल्ट मानों पर निर्भर नहीं करता है, जो कि डेवलपर के अनुकूल व्यवहार है।
1।
class Person {
int SSN ; // gets initialized to zero by default
}
2।
class PersonBetter {
Integer SSN; //gets initialized to null by default
}
पहले मामले में, आप SSN मूल्य को अनधिकृत नहीं रख सकते। यदि आप इसका उपयोग करने का प्रयास करने से पहले मान सेट कर रहे थे तो यह आपको नुकसान पहुंचा सकता है।
दूसरे मामले में, आप एसएसएन को शून्य से आरंभिक रख सकते हैं। जो NullPointerException को जन्म दे सकता है, लेकिन यह एसएसएन के रूप में अनजाने में डिफ़ॉल्ट मानों (शून्य) को डेटाबेस में डालने से बेहतर है जब भी आप एसएसएन फ़ील्ड को इनिशियलाइज़ किए बिना इसका उपयोग करने का प्रयास करते हैं।
PersonBuilder
यदि आप SSN Person
उदाहरण के लिए "बिल्ड" को कॉल करने से पहले सेट नहीं है, तो आप एक अपवाद को फेंक देते हैं । मुझे लगता है कि इस तरह की बात अत्यधिक है, लेकिन यह है कि जावा भाषा उचित पैटर्न को बढ़ावा देती है।
मैं केवल रैपर प्रकारों का उपयोग करूंगा यदि आपको करना है।
उनका उपयोग करने में आप इस तथ्य के अलावा बहुत कुछ हासिल नहीं करते हैं कि वे हैं Objects
।
और, आप स्मृति उपयोग और बॉक्सिंग / अनबॉक्सिंग में बिताए गए ओवरहेड खो देते हैं।
व्यावहारिक रूप से मुझे ऐसी स्थिति का सामना करना पड़ा जहां आवरण वर्ग के उपयोग के बारे में बताया जा सकता है।
मैंने एक सेवा वर्ग बनाया जिसमें एक long
प्रकार का चर था
long
- जब आरंभीकृत नहीं किया जाता है, तो इसे 0 पर सेट किया जाएगा - यह GUI में प्रदर्शित होने पर उपयोगकर्ता को भ्रमित करेगा Long
- जब इनिशियलाइज़ नहीं किया जाता है, तो इसे सेट किया जाएगा null
- यह शून्य मान GUI में दिखाई नहीं देगा।यह उन पर भी लागू होता है Boolean
जहां मान अधिक भ्रामक हो सकते हैं जब हम आदिम का उपयोग करते हैं boolean
(जैसा कि डिफ़ॉल्ट मान गलत है)।
संग्रह सरल जावा आवरण वस्तुओं के लिए विशिष्ट मामला है। हालाँकि, आप कोड (मान ऑब्जेक्ट) में रैपर को अधिक विशिष्ट अर्थ देने पर विचार कर सकते हैं।
IMHO लगभग हमेशा एक फायदा होता है जब यह कोड की पठनीयता और बनाए रखने के लिए मूल्य वस्तुओं का उपयोग करता है। वस्तुओं के अंदर सरल डेटा संरचनाओं को लपेटना जब उनके पास कुछ जिम्मेदारियां होती हैं, तो अक्सर कोड को सरल करता है। यह कुछ ऐसा है जो Domain-Driven Design में बहुत महत्वपूर्ण है ।
निश्चित रूप से प्रदर्शन का मुद्दा है, लेकिन मैं इस बात को नजरअंदाज कर देता हूं कि जब तक मेरे पास उचित डेटा के साथ प्रदर्शन को मापने और समस्याग्रस्त क्षेत्र की ओर अधिक निर्देशित कार्रवाई करने की संभावना नहीं है। यदि कोड को भी समझना आसान है तो प्रदर्शन के मुद्दे को समझना आसान हो सकता है।
संख्यात्मक गणनाओं पर हावी होने वाले अनुप्रयोगों का प्रदर्शन आदिम के उपयोग से बहुत लाभ उठा सकता है।
आदिम प्रकार, एक == ऑपरेटर का उपयोग करता है, लेकिन आवरण के लिए पसंदीदा विकल्प बराबर () विधि को कॉल करना है।
"आदिम प्रकार को हानिकारक माना जाता है" क्योंकि वे प्रक्रियात्मक शब्दार्थों को एक समान रूप से एक समान वस्तु-उन्मुख मॉडल में मिलाते हैं।
कई प्रोग्रामर इसे सूचित करने के लिए संख्याओं को 0 (डिफ़ॉल्ट) या -1 से प्रारंभ करते हैं, लेकिन परिदृश्य के आधार पर, यह गलत या भ्रामक हो सकता है।
यदि आप संग्रह का उपयोग करना चाहते हैं, तो आपको Wrapper कक्षाओं का उपयोग करना चाहिए ।
आदिम प्रकार, सरणियों के लिए उपयोग किया जाता है। इसके अलावा, ऐसे डेटा का प्रतिनिधित्व करने के लिए जिनका कोई व्यवहार नहीं है, उदाहरण के लिए, एक काउंटर या बूलियन स्थिति।
ऑटोबॉक्सिंग के बाद से, "कब से प्रिमिटिव या रैपर का उपयोग करना है" फ्रंटियर काफी फजी हो गया है।
लेकिन याद रखें, रैपर्स ऑब्जेक्ट हैं, इसलिए आपको सभी फैंसी जावा फीचर मिलते हैं। उदाहरण के लिए, आप इंटेगर ऑब्जेक्ट बनाने के लिए रिफ्लेक्शन का उपयोग कर सकते हैं, लेकिन इंट वैल्यू नहीं। रैपर क्लासेस में भी वैल्यूऑफ जैसे तरीके होते हैं।
यदि आप एक मूल्य प्रकार बनाना चाहते हैं। एक ProductSKU या AirportCode की तरह कुछ।
जब एक आदिम प्रकार (मेरे उदाहरण में स्ट्रिंग) समानता को परिभाषित करता है, तो आप समानता को ओवरराइड करना चाहेंगे।
जावा में आदिम मूल्य वस्तु नहीं हैं। ऑब्जेक्ट के रूप में इन मूल्यों में हेरफेर करने के लिए java.lang पैकेज प्रत्येक आदिम डेटा प्रकार के लिए एक आवरण वर्ग प्रदान करता है।
सभी रैपर कक्षाएं अंतिम हैं। आरंभ किए जा सकने वाले सभी आवरण वर्गों की वस्तु अपरिवर्तनीय है अर्थात आवरण वस्तु में मूल्य को नहीं बदला जा सकता है।
हालाँकि, शून्य वर्ग को एक आवरण वर्ग माना जाता है, लेकिन यह किसी भी आदिम मूल्यों को लपेटता नहीं है और यह अयोग्य नहीं है। इसमें सार्वजनिक निर्माता नहीं है, यह केवल कीवर्ड शून्य का प्रतिनिधित्व करने वाली एक क्लास ऑब्जेक्ट को दर्शाता है।