यह वास्तव में इस संग्रह पर व्यापक रूप से साझा करने की आवश्यकता पर निर्भर करता है। एक परिवर्तनीय संग्रह का लाभ यह है कि यह आमतौर पर अपरिवर्तनीय संग्रह से तेज़ होता है, और यह सुनिश्चित करने के बजाय कि आप विभिन्न संदर्भों से एक var सेट कर सकते हैं, एक ऑब्जेक्ट को पास करना आसान है। लेकिन जब से वे आप के नीचे से बाहर बदल सकते हैं, तो आप भी एक एकल पिरोया संदर्भ में सावधान रहना होगा:
import collection.mutable.ArrayBuffer
val a = ArrayBuffer(1,2,3,4)
val i = a.iterator
i.hasNext // True
a.reduceToSize(0)
i.next // Boom!
java.lang.IndexOutOfBoundsException: 0
at scala.collection.mutable.ResizableArray$class.apply(ResizableArray.scala:43)
...
तो अगर यह व्यापक रूप से इस्तेमाल किया जा रहा है, तो आप पर विचार करना चाहिए कि क्या आप से बचने के लिए उचित रूप से सावधान किया जा सकता है इस तरह की समस्याएं। एक अप्रत्याशित संग्रह में var
का उपयोग करना आम तौर पर सुरक्षित है; तो आप तारीख से बाहर हो सकते हैं, लेकिन कम से कम आप अपने चेहरे पर एक segfault के साथ नहीं गिरेंगे।
var v = Vector(1,2,3,4)
val i = v.iterator
i.hasNext // True
v = Vector[Int]()
i.next // 1
हालांकि अब आप v
कोई भी तरीका है कि यह (कक्षा जिसमें वह शामिल है के बाहर कम से कम,) को संशोधित कर सकते हैं से एक वापसी मान के रूप में पारित करने के लिए की है।यह भी समस्याएं पैदा कर सकता है कि आप मूल मान अपडेट भूल जाते हैं:
var v = Vector(1,2,3,4)
def timesTwo = v.map(_ * 2)
timesTwo
v // Wait, it's still 1,2,3,4?!
लेकिन तब यह या तो अद्यतन नहीं है, यह
a.map(_ * 2) // Map doesn't update, it produces a new copy!
?: करता तो एक सामान्य नियम के रूप में,
- प्रदर्शन से एक का उपयोग करने की आवश्यकता है - यह एक विधि के भीतर
- स्थानीय गुंजाइश का उपयोग करें - परिवर्तनशील संग्रह का उपयोग
- अन्य थ्रेड/वर्गों के साथ साझा किया - अपरिवर्तनीय संग्रह का उपयोग
एक वर्ग के भीतर
- कार्यान्वयन, सरल कोड - का उपयोग परिवर्तनशील संग्रह
एक वर्ग के भीतर
- कार्यान्वयन, जटिल कोड - का उपयोग अपरिवर्तनीय
लेकिन आपको चाहिए शायद आप इसे जितनी बार चिपके रहते हैं उसका उल्लंघन करें।
अधिक संदर्भ के बिना, यह वास्तव में कोई फर्क नहीं पड़ता है। न तो एक कार्यात्मक दृष्टिकोण है। उत्परिवर्ती संग्रह शायद एक अपरिवर्तनीय var से बेहतर प्रदर्शन करेगा। – dbyrne
@dbyrne * उत्परिवर्ती संग्रह शायद एक अपरिवर्तनीय var * व्हाओ से बेहतर प्रदर्शन करेगा? क्या वे एक ही टीम में दो खेल नहीं हैं? जैसे 'वैल misterMutableCollection = collection.mutable ....' –
@ ओम-नाम-नाम एक अपरिवर्तनीय var के साथ, आपको एक पूरी तरह से नया संग्रह बनाना होगा और इसे स्वैप करना होगा। एक परिवर्तनीय वैल के साथ, आप इसे संग्रहीत करने के लिए मूल संग्रह और कॉल विधियों का उपयोग कर सकते हैं। – dbyrne