जावा टीम ने जावा 8. में कार्यात्मक प्रोग्रामिंग में बाधाओं को दूर करने का एक टन का काम किया है। विशेष रूप से, java.util कलेक्शंस में बदलाव बहुत तेजी से सुव्यवस्थित परिचालनों में परिवर्तन का पीछा करने का एक बड़ा काम करते हैं। यह देखते हुए कि संग्रह पर प्रथम श्रेणी के कार्यों और कार्यात्मक तरीकों को जोड़कर उन्होंने कितना अच्छा काम किया है, क्यों वे अपरिवर्तनीय संग्रह या यहां तक कि अपरिवर्तनीय संग्रह इंटरफेस प्रदान करने में पूरी तरह से विफल रहे हैं?
किसी भी मौजूदा कोड को बदलने के बिना, जावा टीम किसी भी समय अपरिवर्तनीय इंटरफेस को जोड़ सकती है, जो कि परिवर्तनशील लोगों के समान हैं, "सेट" विधियों को माइनस करते हैं और मौजूदा इंटरफेस को इस तरह से बढ़ाते हैं:
ImmutableIterable
____________/ |
/ |
Iterable ImmutableCollection
| _______/ / \ \___________
| / / \ \
Collection ImmutableList ImmutableSet ImmutableMap ...
\ \ \_________|______________|__________ |
\ \___________|____________ | \ |
\___________ | \ | \ |
List Set Map ...
निश्चित रूप से, सूची .add () और Map.put () जैसे ऑपरेशन वर्तमान में दिए गए कुंजी के लिए एक बूलियन या पिछला मान लौटाते हैं, यह इंगित करने के लिए कि ऑपरेशन सफल हुआ या विफल। अपरिवर्तनीय संग्रह को कारखानों के रूप में इस तरह के तरीकों का इलाज करना होगा और जोड़े गए तत्व के साथ एक नया संग्रह लौटना होगा - जो वर्तमान हस्ताक्षर के साथ असंगत है। लेकिन ImmutableList.append () या .addAt () और ImmutableMap.putEntry () जैसे एक अलग विधि नाम का उपयोग करके काम किया जा सकता है। परिणामस्वरूप संग्रहणीयता अपरिवर्तनीय संग्रह के साथ काम करने के लाभों से अधिक होगी, और प्रकार प्रणाली गलत पद्धति को कॉल करने की त्रुटियों को रोक देगी। समय के साथ, पुराने तरीकों को हटा दिया जा सकता था।
अपरिवर्तनीय संग्रह की जीत:
- सरलता - कोड के बारे में तर्क सरल है जब अंतर्निहित डेटा नहीं बदलता है।
- प्रलेखन - यदि कोई विधि अपरिवर्तनीय संग्रह इंटरफ़ेस लेता है, तो आप जानते हैं कि यह उस संग्रह को संशोधित करने वाला नहीं है। यदि कोई विधि अपरिवर्तनीय संग्रह लौटाती है, तो आप जानते हैं कि आप इसे संशोधित नहीं कर सकते।
- कंजेंसी - अपरिवर्तनीय संग्रह को थ्रेड्स में सुरक्षित रूप से साझा किया जा सकता है।
जैसा कि किसी ने उन भाषाओं का स्वाद चखा है जो अपरिवर्तनीयता का अनुमान लगाते हैं, जंगली जंगली उत्परिवर्ती उत्परिवर्तन पर वापस जाना बहुत कठिन है। क्लोजर के संग्रह (सीक्वेंस एब्स्ट्रक्शन) में पहले से ही सब कुछ है जो जावा 8 संग्रह प्रदान करता है, प्लस अपरिवर्तनीयता (हालांकि स्ट्रीम के बजाय लिंक किए गए सूचियों के कारण अतिरिक्त मेमोरी और समय का उपयोग कर सकता है)। स्काला के पास संचालन के पूरे सेट के साथ परस्पर और अपरिवर्तनीय दोनों संग्रह हैं, और हालांकि वे संचालन उत्सुक हैं, कॉलिंग .iterator एक आलसी दृश्य देता है (और आलसी के अन्य तरीके हैं जो उनका मूल्यांकन कर रहे हैं)। मैं यह नहीं देखता कि जावा अपरिवर्तनीय संग्रह के बिना प्रतिस्पर्धा कैसे जारी रख सकता है।
क्या कोई मुझे इतिहास या इस बारे में चर्चा करने के लिए कह सकता है? निश्चित रूप से यह कहीं न कहीं सार्वजनिक है।
const
संग्रह है
Collections.unmodifiable*()
कर रहे हैं। लेकिन जब वे नहीं हैं, तो उन्हें अपरिवर्तनीय न
ImmutableList
उस आरेख में होता है, तो लोग एक परिवर्तनशील में पारित कर सकते हैं List
? नहीं, यह एलएसपी का बहुत बुरा उल्लंघन है।