अपरिवर्तनीय वस्तु

वस्तु-उन्मुख कंप्यूटर प्रोग्रामिंग में | वस्तु-उन्मुख और कार्यात्मक प्रोग्रामिंग प्रोग्रामिंग, एक अपरिवर्तनीय वस्तु (अपरिवर्तनीय ऑब्जेक्ट) एक ऑब्जेक्ट (कंप्यूटर साइंस) है, जिसकी स्थिति बनने के बाद उसे संशोधित नहीं किया जा सकता है। यह एक परिवर्तनशील वस्तु (परिवर्तनशील वस्तु) के विपरीत है, जिसे बनने के बाद संशोधित किया जा सकता है। कुछ मामलों में, एक वस्तु को अपरिवर्तनीय माना जाता है, भले ही कुछ आंतरिक रूप से उपयोग की जाने वाली विशेषताएँ बदल जाती हैं, लेकिन वस्तु की स्थिति बाहरी दृष्टिकोण से अपरिवर्तित दिखाई देती है। उदाहरण के लिए, एक वस्तु जो उपयोग करती है महंगी संगणनाओं के परिणामों को कैश करने के लिए संस्मरण अभी भी एक अपरिवर्तनीय वस्तु माना जा सकता है।

ऑब्जेक्ट ओरिएंटेड प्रोग्रामिंग में पठनीयता और रनटाइम दक्षता में सुधार के लिए स्ट्रिंग्स और अन्य ठोस वस्तुओं को आम तौर पर अपरिवर्तनीय वस्तुओं के रूप में व्यक्त किया जाता है। अपरिवर्तनीय वस्तुएँ भी उपयोगी होती हैं क्योंकि वे स्वाभाविक रूप से थ्रेड सुरक्षा | थ्रेड-सुरक्षित होती हैं। अन्य लाभ यह हैं कि वे समझने में सरल हैं और उनके बारे में तर्क करते हैं और परिवर्तनशील वस्तुओं की तुलना में उच्च सुरक्षा प्रदान करते हैं।

अपरिवर्तनीय चर
अनिवार्य प्रोग्रामिंग में, कार्यक्रम चर ्स में रखे गए मान जिनकी सामग्री कभी नहीं बदलती है, उन्हें कॉन्स्टेंट (प्रोग्रामिंग) के रूप में जाना जाता है ताकि उन्हें वेरिएबल्स से अलग किया जा सके जो निष्पादन के दौरान बदल सकते हैं। उदाहरणों में मीटर से फ़ुट तक रूपांतरण कारक, या पाई का मान कई दशमलव स्थानों तक शामिल हैं।

रीड-ओनली फ़ील्ड की गणना तब की जा सकती है जब प्रोग्राम चलता है (स्थिरांक के विपरीत, जो पहले से ज्ञात हैं), लेकिन आरंभ होने के बाद कभी नहीं बदलते।

कमजोर बनाम मजबूत अपरिवर्तनीयता
कभी-कभी, किसी वस्तु के कुछ क्षेत्रों के अपरिवर्तनीय होने की बात करता है। इसका अर्थ है कि वस्तु स्थिति के उन भागों को बदलने का कोई तरीका नहीं है, भले ही वस्तु के अन्य भाग परिवर्तनशील (कमजोर रूप से अपरिवर्तनीय) हो सकते हैं। यदि सभी क्षेत्र अपरिवर्तनीय हैं, तो वस्तु अपरिवर्तनीय है। यदि संपूर्ण वस्तु को किसी अन्य वर्ग द्वारा विस्तारित नहीं किया जा सकता है, तो वस्तु को दृढ़ता से अपरिवर्तनीय कहा जाता है। यह, उदाहरण के लिए, वस्तु के जीवनकाल के माध्यम से समान रहने वाली वस्तु में कुछ निश्चित डेटा के बारे में स्पष्ट रूप से लागू करने में मदद कर सकता है। कुछ भाषाओं में, यह एक कीवर्ड के साथ किया जाता है (उदा.  सी ++ में,   जावा (प्रोग्रामिंग भाषा) में) जो क्षेत्र को अपरिवर्तनीय के रूप में निर्दिष्ट करता है। कुछ भाषाएं इसे उलट देती हैं: OCaml में, किसी वस्तु या रिकॉर्ड के क्षेत्र डिफ़ॉल्ट रूप से अपरिवर्तनीय होते हैं, और इन्हें स्पष्ट रूप से चिह्नित किया जाना चाहिए   ऐसा होना।

वस्तुओं के संदर्भ
अधिकांश वस्तु-उन्मुख प्रोग्रामिंग भाषा |ऑब्जेक्ट-ओरिएंटेड लैंग्वेज में, ऑब्जेक्ट्स को रेफरेंस (कंप्यूटर साइंस) का उपयोग करके संदर्भित किया जा सकता है। ऐसी भाषाओं के कुछ उदाहरण जावा (प्रोग्रामिंग भाषा), सी++, सी शार्प (प्रोग्रामिंग भाषा)|सी#, वीबी.नेट और कई स्क्रिप्टिंग भाषाएं हैं, जैसे पर्ल, पायथन (प्रोग्रामिंग भाषा), और रूबी प्रोग्रामिंग भाषा। इस मामले में, यह मायने रखता है कि क्या किसी वस्तु की स्थिति भिन्न हो सकती है जब वस्तुओं को संदर्भों के माध्यम से साझा किया जाता है।

वस्तुओं की नकल बनाम संदर्भ
यदि किसी वस्तु को अपरिवर्तनीय माना जाता है, तो संपूर्ण वस्तु की नकल करने के बजाय उसका एक संदर्भ (कंप्यूटर विज्ञान) बनाना पसंद किया जाता है। यह डेटा डुप्लीकेशन को रोककर और कंस्ट्रक्टर और डिस्ट्रक्टर्स को कॉल से बचने के लिए मेमोरी को संरक्षित करने के लिए किया जाता है; इसके परिणामस्वरूप निष्पादन की गति में संभावित वृद्धि होती है।

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

लिखने पर नकल
एक तकनीक जो परिवर्तनीय और अपरिवर्तनीय वस्तुओं के लाभों को मिश्रित करती है, और लगभग सभी आधुनिक हार्डवेयर में सीधे समर्थित है, कॉपी-ऑन-राइट (COW) है। इस तकनीक का उपयोग करते हुए, जब कोई उपयोगकर्ता सिस्टम को ऑब्जेक्ट कॉपी करने के लिए कहता है, तो यह केवल एक नया संदर्भ बनाता है जो अभी भी उसी ऑब्जेक्ट को इंगित करता है। जैसे ही कोई उपयोगकर्ता किसी विशेष संदर्भ के माध्यम से वस्तु को संशोधित करने का प्रयास करता है, सिस्टम एक वास्तविक प्रति बनाता है, उस पर संशोधन लागू करता है, और नई प्रतिलिपि को संदर्भित करने के लिए संदर्भ सेट करता है। अन्य उपयोगकर्ता अप्रभावित हैं, क्योंकि वे अभी भी मूल वस्तु को संदर्भित करते हैं। इसलिए, गाय के तहत, सभी उपयोगकर्ताओं को अपनी वस्तुओं का एक परिवर्तनशील संस्करण दिखाई देता है, हालांकि इस मामले में कि उपयोगकर्ता अपनी वस्तुओं को संशोधित नहीं करते हैं, अपरिवर्तनीय वस्तुओं के स्थान-बचत और गति के फायदे संरक्षित हैं। कॉपी-ऑन-राइट आभासी मेमोरी  सिस्टम में लोकप्रिय है क्योंकि यह उन्हें मेमोरी स्पेस को बचाने की अनुमति देता है जबकि अभी भी किसी एप्लिकेशन प्रोग्राम को सही तरीके से हैंडल कर सकता है।

इंटर्निंग
समान वस्तुओं की प्रतियों के स्थान पर हमेशा संदर्भों का उपयोग करने की प्रथा को इंटर्न (कंप्यूटर विज्ञान) के रूप में जाना जाता है। यदि इंटर्निंग का उपयोग किया जाता है, तो दो वस्तुओं को समान माना जाता है यदि और केवल यदि उनके संदर्भ, आमतौर पर पॉइंटर्स या पूर्णांक के रूप में दर्शाए जाते हैं, बराबर होते हैं। कुछ भाषाएँ स्वचालित रूप से ऐसा करती हैं: उदाहरण के लिए, पायथन (प्रोग्रामिंग भाषा) स्वचालित रूप से स्ट्रिंग इंटर्न पूल। यदि एल्गोरिदम जो इंटर्निंग को लागू करता है, उसे हर मामले में ऐसा करने की गारंटी दी जाती है कि यह संभव है, तो समानता के लिए वस्तुओं की तुलना उनके पॉइंटर्स की तुलना करने के लिए कम हो जाती है - अधिकांश अनुप्रयोगों में गति में पर्याप्त लाभ। (यहां तक ​​​​कि अगर एल्गोरिदम व्यापक होने की गारंटी नहीं है, तब भी वस्तुओं के बराबर होने और समान संदर्भ का उपयोग करने पर तेज़ पथ मामले में सुधार की संभावना मौजूद है।) इंटर्निंग आम तौर पर केवल अपरिवर्तनीय वस्तुओं के लिए उपयोगी होती है।

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

अपरिवर्तनीयता का उल्लंघन
अपरिवर्तनीयता का अर्थ यह नहीं है कि कंप्यूटर के कंप्यूटर भंडारण में संग्रहीत वस्तु लिखने योग्य नहीं है। बल्कि, अपरिवर्तनीयता एक संकलन-समय का निर्माण है जो इंगित करता है कि एक प्रोग्रामर वस्तु के सामान्य इंटरफ़ेस के माध्यम से क्या कर सकता है, जरूरी नहीं कि वे बिल्कुल क्या कर सकते हैं (उदाहरण के लिए, टाइप सिस्टम को दरकिनार करके या सी (प्रोग्रामिंग भाषा) में शुद्धता का उल्लंघन करके) या सी ++)।

भाषा-विशिष्ट विवरण
पायथन (प्रोग्रामिंग लैंग्वेज), जावा (प्रोग्रामिंग लैंग्वेज) और .NET फ्रेमवर्क में, स्ट्रिंग्स अपरिवर्तनीय वस्तुएं हैं। जावा और .NET फ्रेमवर्क दोनों में स्ट्रिंग के परिवर्तनशील संस्करण हैं। जावा में ये हैं  और   (जावा के परिवर्तनशील संस्करण ) और .NET में यह है   (.Net का परिवर्तनशील संस्करण  ). पायथन 3 में एक परिवर्तनशील स्ट्रिंग (बाइट्स) संस्करण है, जिसका नाम है. इसके अतिरिक्त, जावा में सभी आदिम आवरण वर्ग अपरिवर्तनीय हैं।

इसी तरह के पैटर्न अपरिवर्तनीय इंटरफ़ेस और अपरिवर्तनीय आवरण हैं।

शुद्ध कार्यात्मक प्रोग्रामिंग भाषाओं में भाषा को विस्तारित किए बिना परिवर्तनीय वस्तुओं को बनाना संभव नहीं है (उदाहरण के लिए एक परिवर्तनीय संदर्भ पुस्तकालय या विदेशी फ़ंक्शन इंटरफ़ेस के माध्यम से), इसलिए सभी ऑब्जेक्ट अपरिवर्तनीय हैं।

अदा
Ada (प्रोग्रामिंग लैंग्वेज) में, किसी भी वस्तु को या तो चर घोषित किया जाता है (अर्थात परिवर्तनशील; आमतौर पर अंतर्निहित डिफ़ॉल्ट), या  (यानी अपरिवर्तनीय) के माध्यम से   कीवर्ड। उपप्रोग्राम पैरामीटर इन मोड में अपरिवर्तनीय हैं, और आउट और आउट मोड में उत्परिवर्तनीय हैं।

सी #
सी शार्प (प्रोग्रामिंग लैंग्वेज) | सी # में आप एक वर्ग के क्षेत्रों की अपरिवर्तनीयता को लागू कर सकते हैं  कथन। सभी क्षेत्रों को अपरिवर्तनीय के रूप में लागू करके, आप एक अपरिवर्तनीय प्रकार प्राप्त करते हैं।

सी ++
सी ++ में, एक कॉन्स्ट-शुद्धता | कॉन्स्ट-सही कार्यान्वयन  उपयोगकर्ता को कक्षा के उदाहरण बनाने और फिर उनका उपयोग करने की अनुमति देगा   (अपरिवर्तनीय) या परिवर्तनशील, जैसा कि वांछित है, के दो अलग-अलग संस्करण प्रदान करके   तरीका। (ध्यान दें कि सी ++ में यह जरूरी नहीं है - और वास्तव में असंभव - एक विशेष कन्स्ट्रक्टर प्रदान करने के लिए   उदाहरण।)

ध्यान दें कि, जब कोई डेटा सदस्य होता है जो किसी अन्य ऑब्जेक्ट के लिए सूचक या संदर्भ होता है, तो केवल गैर-कॉन्स्ट विधि के भीतर इंगित या संदर्भित ऑब्जेक्ट को म्यूटेट करना संभव है।

C++ सार (बिटवाइज़ के विपरीत) के माध्यम से अपरिवर्तनीयता भी प्रदान करता है  कीवर्ड, जो एक सदस्य चर को एक के भीतर से बदलने देता है   तरीका।

डी
D (प्रोग्रामिंग लैंग्वेज) में, दो प्रकार क्वालीफायर टाइप करें मौजूद होते हैं,  और , वेरिएबल्स के लिए जिन्हें बदला नहीं जा सकता। C++ के विपरीत  , मई आपको  , और सी#एस  , वे सकर्मक हैं और ऐसे चर के संदर्भों के माध्यम से किसी भी चीज़ पर पुनरावर्ती रूप से लागू होते हैं। बीच में अंतर   और   वे किस पर लागू होते हैं:   चर की एक संपत्ति है: संदर्भित मूल्य के लिए कानूनी रूप से परस्पर संदर्भ मौजूद हो सकते हैं, अर्थात मूल्य वास्तव में बदल सकता है। इसके विपरीत,   निर्दिष्ट मूल्य की एक संपत्ति है: मूल्य और इससे संक्रमणीय रूप से पहुंचने योग्य कुछ भी नहीं बदला जा सकता है (टाइप सिस्टम को तोड़ने के बिना, अपरिभाषित व्यवहार के लिए अग्रणी)। उस मान के किसी भी संदर्भ को चिह्नित किया जाना चाहिए   या. मूल रूप से किसी भी अयोग्य प्रकार के लिए,   का असंयुक्त संघ है   (परिवर्तनीय) और.

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

इस तरह एक समारोह में:

ब्रेसिज़ के अंदर,  के रूप में एक ही वस्तु को संदर्भित कर सकता है , इसलिए उत्परिवर्तन   परोक्ष रूप से बदल सकता है   भी। भी, के रूप में एक ही वस्तु को संदर्भित कर सकता है, लेकिन चूंकि मूल्य अपरिवर्तनीय है, इसमें कोई बदलाव नहीं है। हालाँकि,   और   कानूनी रूप से एक ही वस्तु का उल्लेख नहीं कर सकता।

गारंटी की भाषा में, mutable की कोई गारंटी नहीं है (फ़ंक्शन वस्तु को बदल सकता है),  केवल-बाहरी गारंटी है कि फ़ंक्शन कुछ भी नहीं बदलेगा, और एक द्विदिश गारंटी है (फ़ंक्शन मान नहीं बदलेगा और कॉल करने वाले को इसे नहीं बदलना चाहिए)।

मान जो हैं  या   घोषणा के बिंदु (कंप्यूटर प्रोग्रामिंग) या एक कंस्ट्रक्टर (ऑब्जेक्ट-ओरिएंटेड प्रोग्रामिंग) द्वारा प्रत्यक्ष असाइनमेंट द्वारा आरंभ किया जाना चाहिए।

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

अपरिवर्तनीय मानों को उत्परिवर्तनीय पर कास्ट करने से परिवर्तन पर अपरिभाषित व्यवहार होता है, भले ही मूल मूल्य एक उत्परिवर्तनीय मूल से आता हो। अपरिवर्तनीय मूल्यों को अपरिवर्तनीय में कास्टिंग करना कानूनी हो सकता है जब बाद में कोई परिवर्तनीय संदर्भ नहीं रहता है। एक व्यंजक को उत्परिवर्तनीय (...) से अपरिवर्तनीय में परिवर्तित किया जा सकता है यदि व्यंजक अद्वितीय है और सभी व्यंजक जिन्हें यह सकर्मक रूप से संदर्भित करता है या तो अद्वितीय या अपरिवर्तनीय हैं। यदि संकलक विशिष्टता साबित नहीं कर सकता है, तो कास्टिंग स्पष्ट रूप से की जा सकती है और यह सुनिश्चित करने के लिए प्रोग्रामर पर निर्भर है कि कोई परिवर्तनशील संदर्भ मौजूद नहीं है।

प्ररूप  के लिए एक उपनाम है , यानी अपरिवर्तनीय पात्रों की स्मृति का एक टाइप किया हुआ टुकड़ा। सबस्ट्रिंग बनाना सस्ता है, क्योंकि यह सिर्फ एक पॉइंटर और फाइल की गई लंबाई को कॉपी और संशोधित करता है, और सुरक्षित है, क्योंकि अंतर्निहित डेटा को बदला नहीं जा सकता है। प्रकार की वस्तुएँ   स्ट्रिंग्स को संदर्भित कर सकता है, लेकिन म्यूटेबल बफ़र्स को भी।

किसी स्थिरांक या अपरिवर्तनीय मान की उथली प्रतिलिपि बनाने से अपरिवर्तनीयता की बाहरी परत हट जाती है: एक अपरिवर्तनीय स्ट्रिंग की प्रतिलिपि बनाना एक स्ट्रिंग देता है. अपरिवर्तनीय सूचक और लंबाई की नकल की जा रही है और प्रतियां परस्पर हैं। संदर्भित डेटा को कॉपी नहीं किया गया है और इसके क्वालीफायर को उदाहरण में रखा गया है. एक गहरी प्रति बनाकर इसे हटाया जा सकता है, उदा। का उपयोग  समारोह।

जावा
एक अपरिवर्तनीय वस्तु का एक उत्कृष्ट उदाहरण जावा का एक उदाहरण है  कक्षा

प्रक्रिया  डेटा एबीसी कि नहीं बदलता है   रोकना। इसके बजाय, एक नया स्ट्रिंग ऑब्जेक्ट तत्काल किया जाता है और इसके निर्माण के दौरान डेटा एबीसी दिया जाता है। इस स्ट्रिंग ऑब्जेक्ट का संदर्भ इसके द्वारा दिया जाता है   तरीका। स्ट्रिंग बनाने के लिए   डेटा शामिल करें abc, एक अलग दृष्टिकोण की आवश्यकता है:

अब स्ट्रिंग  एक नई स्ट्रिंग ऑब्जेक्ट का संदर्भ देता है जिसमें abc शामिल है। वर्ग स्ट्रिंग की घोषणा के सिंटैक्स में कुछ भी नहीं है जो इसे अपरिवर्तनीय के रूप में लागू करता है; बल्कि, स्ट्रिंग क्लास की कोई भी विधि उस डेटा को प्रभावित नहीं करती है जिसमें स्ट्रिंग ऑब्जेक्ट शामिल है, इस प्रकार इसे अपरिवर्तनीय बना देता है।

कीवर्ड  (अंतिम (जावा)#अंतिम चर) का उपयोग अपरिवर्तनीय आदिम प्रकार और वस्तु संदर्भों को लागू करने में किया जाता है, लेकिन यह स्वयं वस्तुओं को अपरिवर्तनीय नहीं बना सकता है। नीचे उदाहरण देखें:

आदिम प्रकार चर (, ,  , आदि) परिभाषित होने के बाद पुन: असाइन किया जा सकता है। के प्रयोग से इससे बचा जा सकता है.

केवल का उपयोग करके संदर्भ प्रकारों को अपरिवर्तनीय नहीं बनाया जा सकता है  कीवर्ड।   केवल पुन: असाइनमेंट रोकता है।

आदिम रैपर भी सभी अपरिवर्तनीय हैं। कुछ सरल दिशानिर्देशों का पालन करके अपरिवर्तनीय कक्षाएं लागू की जा सकती हैं।

जावास्क्रिप्ट
जावास्क्रिप्ट में, सभी आदिम प्रकार (अपरिभाषित, अशक्त, बूलियन, संख्या, BigInt, स्ट्रिंग, प्रतीक) अपरिवर्तनीय हैं, लेकिन कस्टम ऑब्जेक्ट आम तौर पर परिवर्तनशील होते हैं।

किसी वस्तु में अपरिवर्तनीयता का अनुकरण करने के लिए, गुणों को केवल-पढ़ने के लिए परिभाषित किया जा सकता है (लिखने योग्य: झूठा)।

हालांकि, उपरोक्त दृष्टिकोण अभी भी नई संपत्तियों को जोड़ने देता है। वैकल्पिक रूप से, कोई मौजूदा वस्तुओं को अपरिवर्तनीय बनाने के लिए Object.freeze का उपयोग कर सकता है।

ECMA262 के कार्यान्वयन के साथ, जावास्क्रिप्ट में अपरिवर्तनीय संदर्भ बनाने की क्षमता है जिसे पुन: असाइन नहीं किया जा सकता है। हालाँकि, ए का उपयोग करना  घोषणा का मतलब यह नहीं है कि रीड-ओनली रेफरेंस का मूल्य अपरिवर्तनीय है, बस नाम को नए मान को नहीं सौंपा जा सकता है।

प्रतिक्रिया (जावास्क्रिप्ट पुस्तकालय) की शुरुआत के बाद से जावास्क्रिप्ट में अपरिवर्तनीय स्थिति का उपयोग एक बढ़ती प्रवृत्ति बन गया है, जो फ्लक्स-जैसे राज्य प्रबंधन पैटर्न जैसे रेडक्स (जावास्क्रिप्ट लाइब्रेरी) का समर्थन करता है।

पर्ल
पर्ल में, केवल सभी विशेषताओं को केवल पढ़ने के लिए घोषित करके मू लाइब्रेरी के साथ एक अपरिवर्तनीय वर्ग बना सकते हैं: एक अपरिवर्तनीय वर्ग बनाने के लिए दो चरणों की आवश्यकता होती है: पहला, एक्सेसर्स बनाना (या तो स्वचालित रूप से या मैन्युअल रूप से) जो वस्तु विशेषताओं के संशोधन को रोकता है, और दूसरा, उस वर्ग के उदाहरणों के उदाहरण डेटा के प्रत्यक्ष संशोधन को रोकता है (यह आमतौर पर हैश में संग्रहीत होता था) संदर्भ, और हैश के साथ लॉक किया जा सकता है :: उपयोग के लॉक_हैश फ़ंक्शन): या, मैन्युअल रूप से लिखे गए एक्सेसर के साथ:

पायथन
पायथन (प्रोग्रामिंग लैंग्वेज) में, कुछ बिल्ट-इन प्रकार (संख्या, बूलियन, स्ट्रिंग्स, टुपल्स, फ्रोजनसेट) अपरिवर्तनीय हैं, लेकिन कस्टम वर्ग आम तौर पर परिवर्तनशील होते हैं। एक वर्ग में अपरिवर्तनीयता का अनुकरण करने के लिए, अपवाद बढ़ाने के लिए विशेषता सेटिंग और विलोपन को ओवरराइड कर सकता है:

मानक पुस्तकालय सहायक और, पायथन 3.6 से आगे उपलब्ध, सरल अपरिवर्तनीय कक्षाएं बनाएं। निम्नलिखित उदाहरण मोटे तौर पर ऊपर के बराबर है, साथ ही कुछ टपल जैसी विशेषताएं हैं:

पायथन 3.7 में पेश किया गया, डेवलपर्स को फ्रोजन इंस्टेंसेस के साथ अपरिवर्तनीयता का अनुकरण करने की अनुमति दें। यदि एक जमे हुए डेटाक्लास का निर्माण किया जाता है,   ओवरराइड करेगा   और   अप करने के लिए   अगर आह्वान किया गया।

रैकेट
रैकेट (प्रोग्रामिंग भाषा) अपने कोर पेयर टाइप (cons cells) को अपरिवर्तनीय बनाकर अन्य स्कीम (प्रोग्रामिंग लैंग्वेज) के कार्यान्वयन से काफी हद तक अलग हो जाता है। इसके बजाय, यह एक समानांतर परिवर्तनशील जोड़ी प्रकार प्रदान करता है ,  ,   आदि। इसके अलावा, कई अपरिवर्तनीय प्रकारों का समर्थन किया जाता है, उदाहरण के लिए, अपरिवर्तनीय तार और वैक्टर, और इनका बड़े पैमाने पर उपयोग किया जाता है। नई संरचनाएं डिफ़ॉल्ट रूप से अपरिवर्तनीय होती हैं, जब तक कि किसी फ़ील्ड को विशेष रूप से परिवर्तनशील घोषित नहीं किया जाता है, या संपूर्ण संरचना: भाषा अपरिवर्तनीय हैश टेबल, कार्यात्मक रूप से कार्यान्वित और अपरिवर्तनीय शब्दकोशों का भी समर्थन करती है।

जंग
जंग की जंग (प्रोग्रामिंग भाषा) # स्वामित्व प्रणाली डेवलपर्स को अपरिवर्तनीय चर घोषित करने और अपरिवर्तनीय संदर्भ पारित करने की अनुमति देती है। डिफ़ॉल्ट रूप से, सभी चर और संदर्भ अपरिवर्तनीय हैं। परिवर्तनशील चर और संदर्भ स्पष्ट रूप से इसके साथ बनाए गए हैं  कीवर्ड।

लगातार आइटम जंग में हमेशा अपरिवर्तनीय होते हैं।

स्कैला
स्काला (प्रोग्रामिंग भाषा) में, किसी भी इकाई (संक्षिप्त रूप से, बाध्यकारी) को उत्परिवर्तनीय या अपरिवर्तनीय के रूप में परिभाषित किया जा सकता है: घोषणा में, कोई भी उपयोग कर सकता है   (मान) अपरिवर्तनीय संस्थाओं के लिए और   (चर) परिवर्तनशील लोगों के लिए। ध्यान दें कि भले ही एक अपरिवर्तनीय बंधन को पुन: असाइन नहीं किया जा सकता है, फिर भी यह एक परिवर्तनीय वस्तु को संदर्भित कर सकता है और उस वस्तु पर उत्परिवर्तन विधियों को कॉल करना अभी भी संभव है: बाध्यकारी अपरिवर्तनीय है, लेकिन अंतर्निहित वस्तु उत्परिवर्तनीय हो सकती है।

उदाहरण के लिए, निम्नलिखित कोड स्निपेट: एक अपरिवर्तनीय इकाई को परिभाषित करता है  (पूर्णांक प्रकार संकलन-समय पर अनुमानित है) और एक उत्परिवर्तनीय इकाई नामित है.

डिफ़ॉल्ट रूप से, संग्रह वर्ग जैसे  और   अपरिवर्तनीय हैं, इसलिए अद्यतन-विधियाँ किसी मौजूदा को बदलने के बजाय एक नया उदाहरण लौटाती हैं। हालांकि यह अक्षम लग सकता है, इन वर्गों के कार्यान्वयन और उनकी अपरिवर्तनीयता की गारंटी का मतलब है कि नया उदाहरण मौजूदा नोड्स का पुन: उपयोग कर सकता है, जो विशेष रूप से प्रतियां बनाने के मामले में बहुत कुशल है।

यह भी देखें

 * क्लोजर
 * एरलांग (प्रोग्रामिंग भाषा)
 * एफ शार्प (प्रोग्रामिंग भाषा)|एफ#
 * हास्केल (प्रोग्रामिंग भाषा)
 * म्यूटेटर विधि
 * प्रोलॉग
 * स्काला (प्रोग्रामिंग भाषा)
 * टीसीएल

संदर्भ
This article contains some material from the Perl Design Patterns Book

बाहरी संबंध

 * Immutable objects in C# using 3 simple steps.
 * Article Java theory and practice: To mutate or not to mutate? by Brian Goetz, from IBM DeveloperWorks – saved copy at Internet Archive by Brian Goetz, from IBM DeveloperWorks – saved copy at Internet Archive
 * Immutable objects from JavaPractices.com
 * Immutable objects from Portland Pattern Repository
 * Immutable.js by Facebook
 * Immutable structures in C# opensource project in Codeplex
 * Immutable collections in .NET official library by Microsoft
 * Immutable objects in C# by Tutlane.com