2015-10-19 6 views
6

जावा में, बिगइन्टर अपरिवर्तनीय है लेकिन मैं समझना चाहता हूं कि क्यों कई बार इसका उपयोग बहुत सारी गणना करने के लिए किया जाता है जो बहुत सारी वस्तुओं का उत्पादन कर सकता है। इसलिए, यह अपरिवर्तनीय बनाने के लिए सहज महसूस करता है। मेरे दिमाग में आने वाली स्थिति स्ट्रिंग ऑपरेशंस की तरह कुछ है और फिर स्ट्रिंगबिल्डर का विकल्प है। क्या BigInteger का अपरिवर्तनीय समकक्ष होना चाहिए? मुझे लगता है कि यह कई स्थितियों में फायदेमंद हो सकता है।जावा में बिगइंटर क्यों अपरिवर्तनीय होने के लिए डिज़ाइन किया गया है?

संपादित करें: मुझे अपर्याप्तता के लाभ और कई मामलों में यह कैसे फायदेमंद है। मैं बस w.r.t BigInteger के लाभों को समझना चाहता था। मैंने बड़ी संख्या के फैक्टोरियल की गणना करने के लिए बिगइंटर का उपयोग किया है। तो, मैं एक परिवर्तनीय BigInteger पसंद किया होगा। इसी तरह, BigInteger का उपयोग गणनाओं के लिए किया जाएगा जहां परिणाम int से बहुत बड़ा है। अन्य मामलों के लिए BigDecimal है।

+0

आप 'बिटसेट' को एक (सॉर्ट-ऑफ) म्यूटेबल 'बिगइंटर' के रूप में उपयोग कर सकते हैं। –

+1

अल्पकालिक वस्तुओं सस्ते हैं, और अपरिवर्तनीय वस्तुओं के बहुत सारे फायदे हैं। – chrylis

+0

* "मुझे लगता है कि यह कई स्थितियों में फायदेमंद हो सकता है।" * ... कुछ वास्तव में सुपर-प्रदर्शन महत्वपूर्ण परिस्थितियों के लिए यह महत्वपूर्ण हो सकता है, लेकिन संभवतः आप जितनी परिस्थितियों में अनुमान लगा रहे हैं उतनी परिस्थितियों में नहीं। लेकिन, यदि आपके पास वास्तव में कोड का एक प्रोफाइलिंग-सिद्ध प्रदर्शन-महत्वपूर्ण ब्लॉक है, तो एक परिवर्तनीय साथी वर्ग उत्तर हो सकता है। – scottb

उत्तर

11

Effective Java जोश बलोच से, अपरिवर्तनीय वर्गों के लाभ बताते हैं में "आइटम 15: कम से कम अस्थिरता":

अपरिवर्तनीय कक्षाएं डिजाइन, लागू करने, और परिवर्तनशील वर्गों की तुलना में उपयोग करने के लिए आसान है। वे त्रुटि के लिए कम प्रवण हैं और अधिक सुरक्षित हैं।

एक अपरिवर्तनीय वस्तु, सरल है, क्योंकि वस्तु केवल एक राज्य में मौजूद कर सकते हैं - राज्य यह में बनाया गया था सरल कोड कम कीड़े हो जाता है।। क्योंकि ऑब्जेक्ट को संशोधित नहीं किया जा सकता है, यह बाहरी सिंक्रनाइज़ेशन के बिना थ्रेड-सुरक्षित भी है।

बलोच अपरिवर्तनीय वर्गों के साथ प्रदर्शन समस्या पते, एक उदाहरण के रूप BigInteger का उपयोग कर:

अपरिवर्तनीय वर्गों में से केवल वास्तविक नुकसान यह है कि वे एक अलग मूल्य के लिए एक अलग वस्तु की आवश्यकता है। इन वस्तुओं को बनाना महंगा हो सकता है, खासकर यदि वे बड़े हैं। [...]

आंतरिक रूप से, अपरिवर्तनीय वर्ग मनमाने ढंग से चालाक हो सकता है। उदाहरण के लिए, बिगइन्टर में एक पैकेज-प्राइवेट म्यूटेबल "साथी क्लास" है जो मॉड्यूलर एक्सपोनेंटिएशन जैसे मल्टीस्टेप ऑपरेशंस को गति देने के लिए उपयोग करता है। बिगइन्टर का उपयोग पहले उल्लिखित सभी कारणों से बिगइन्टर का उपयोग करने के बजाय म्यूटेबल साथी वर्ग का उपयोग करना बहुत कठिन है, लेकिन सौभाग्य से आपको यह नहीं करना है: बिगइंटर के कार्यान्वयनकर्ताओं ने आपके लिए कड़ी मेहनत की है।

तो आंतरिक रूप से, BigInteger पहले से ही आपके लिए कुछ अनुकूलन करता है। यदि आप वास्तव में एक म्यूटेबल BigInteger चाहते हैं, तो आप BitSet का उपयोग कर सकते हैं, लेकिन ध्यान दें कि यह संभवतः आपके कोड को अधिक जटिल बनाता है - और अधिक त्रुटि-प्रवण। आपको सबसे आसान संभव समाधान (BigInteger) का उपयोग करना चाहिए जबतक कि आपको विश्वास नहीं है कि एक परिवर्तनीय संस्करण का उपयोग करने से आपको एक उल्लेखनीय प्रदर्शन लाभ मिलेगा (उसी आइटम से "आइटम 55: न्यायसंगत रूप से अनुकूलित करें") भी देखें।

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