2015-08-02 5 views
12

एक जावा साक्षात्कार क्यू & एक सूची मैं होता है, इससे कहना है कि, जावा में आप एक वस्तु को तीन तरह से अडिग बना सकते हैं। तरीकों में से एक है:जावा में कमजोर अपरिवर्तनीय बनाम मजबूत अपरिवर्तनीयता?

सुनिश्चित करें कि तरीकों या तो वर्ग अंतिम (मजबूत अचल स्थिति) बनाने या अपने तरीकों अंतिम (कमजोर अचल स्थिति) बनाकर ओवरराइड नहीं किया जा सकता है।

क्लास फाइनल बनाने से तरीकों को अंतिम बनाने के लिए कम अपरिवर्तनीय माना जाता है? इसके अलावा, मजबूत अपरिवर्तनीयता और कमजोर अपरिवर्तनीयता का क्या अर्थ है?

+6

उपवर्ग अतिरिक्त क्षेत्रों जो बदला जा सकता है हो सकता था। –

+2

ध्यान दें कि जावा में वास्तविक अपरिवर्तनीयता संभव नहीं है, जब तक कि आप अपने किसी भी व्यावसायिक ऑब्जेक्ट पर केवल 'सिंक्रनाइज़' का उपयोग न करने का वादा करते हैं, केवल समर्पित लॉक ऑब्जेक्ट्स पर। – biziclop

+1

@pbabcdefp हालांकि यह सच है, मुझे यकीन नहीं है कि वास्तव में यह एक समस्या है या नहीं। आइए कहें कि हमारे पास 'कक्षा ए' है जो कमजोर अपरिवर्तनीय है। और हमने 'कक्षा बी को ए' बढ़ाया जिसमें नए म्यूटेबल फ़ील्ड हैं। 'ए ए = न्यू बी()' जैसे कोड में, 'ए' संदर्भ के लिए इसका मान अभी भी अपरिवर्तनीय है, क्योंकि 'बी' कुछ भी नहीं बदल सका जो '' 'तक पहुंच है (संरक्षित फ़ील्ड को छोड़कर, लेकिन यदि वे मौजूद हैं मुझे यकीन नहीं है कि 'ए' को अपरिवर्तनीय कहा जा सकता है)। हमें यकीन है कि 'ए' का उपयोग करने वाली सभी विधियों में समान कार्यक्षमता होगी क्योंकि ये विधियां अंतिम हैं। दूसरे शब्दों में 'ए' के ​​लिए उपलब्ध दायरा अभी भी अपरिवर्तनीय होगा। – Pshemo

उत्तर

17

क्योंकि Liskov Substitution Principle बताता है कि कॉलर के पॉइंट-ऑफ-व्यू से सेमेन्टिक्स को बदलने के बिना सुपरक्लास उदाहरण की अपेक्षा की जाती है, जहां सबक्लास उदाहरण को प्रतिस्थापित किया जा सकता है। एक उप-वर्ग उत्परिवर्तनीय व्यवहार पेश कर सकता है, इस प्रकार एलएसपी का उल्लंघन करता है।

एक ओर, अंतिम तरीकों (और निजी सदस्य चर) के रूप में सुपर क्लास इंटरफेस के माध्यम से सीधे देखा अर्थ विज्ञान में फेरबदल के लिए दायरा सीमित। दूसरी ओर, एक परिवर्तनीय उपclass अप्रत्यक्ष रूप से उल्लंघनों का परिचय दे सकता है।

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

0

एक वर्ग फाइनल यह सुनिश्चित करता है कि आप इसे उपवर्ग नहीं कर सकते हैं जिसका अर्थ है कि वर्ग के विस्तार के लिए खुला नहीं है। अपरिवर्तनीयता किसी ऑब्जेक्ट की प्रारंभिक स्थिति को सहेजने के बारे में नहीं है बल्कि यह सुनिश्चित करने के लिए भी नहीं है कि कोई व्यवहारिक परिवर्तन न हो।

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

+0

व्यवहार परिवर्तन ठीक है, जब तक कि व्यवहार * अपरिवर्तनीय भी है। –

+0

अगर हम कह रहे हैं कि व्यवहार अपरिवर्तनीय है तो इसका मतलब यह है कि इसे बदलना नहीं चाहिए। –

+0

लेकिन यह * ऑब्जेक्ट * है जो अपरिवर्तनीय है। –

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