java - Changing value of interface implemented by superclass from subclass affects all instances -
इस सवाल का पहले से ही एक उत्तर है: <
< / P>
SomeClass.java: <पूर्व> कुछSubclass.java: <पूर्व> कुछ Interface.java: <पूर्व> प्रोग्राम, चलाते समय, निम्नलिखित आउटपुट करता है: पहला डीबग संदेश भेजा नहीं है, क्योंकि कुछ शू क्लास के पहले उदाहरण की सूची खाली है हालांकि, एक बार एक तत्व दूसरे उदाहरण की सूची में जोड़ा जाता है, पहले उदाहरण में तत्व भी जोड़ा गया है। ऐसा तब होता है जब क्रमशः जेडीके 1.8 और जावा एसई 8 के साथ संकलित और चलाया जाता है। मैं जो समझता हूं, वह नहीं होना चाहिए। क्या यह जानबूझकर है, और यदि हां, तो यह काम पूरा करने का सही तरीका क्या है? मुझे यह भी लगता है कि मुझे इस सरल कोड के व्यावहारिक कार्यान्वयन का उल्लेख करना चाहिए। मैं बनाए रखने वाले एपीआई में एक ऐसा क्लास होता है जो मेटाडेटाबल नामक एक इंटरफेस को लागू करता है, जो इसके उदाहरणों के मेटाडेटा का एक नक्शा संग्रहीत करता है। हाल के स्नैपशॉट्स में इस क्लास को एक विधि के माध्यम से एपीआई का उपयोग करके प्रोग्राम द्वारा ओवरराइड किया जा सकता है, और जब यह किया जाता है, मेटाडाटा प्रभावी रूप से स्थिर हो जाता है कहने की जरूरत नहीं है, यह एपीआई के पूरे मेटाडाटा भाग को टूट जाता है जब ऐसा होता है। यहाँ समस्या है राज्यों: एक इंटरफ़ेस के शरीर में हर क्षेत्र का घोषणा निहित है पूरे इंटरफ़ेस के लिए आप दो चीजों में से एक कर सकते हैं: अपने इंटरफेस को एक पैकेज somepackage; आयात java.util.List; सार्वजनिक कक्षा SomeClass कुछ इन्टरफेस लागू करता है {सार्वजनिक कुछ क्लास (बूलीयन जोड़) {} सार्वजनिक स्थिर शून्य मुख्य (स्ट्रिंग [] आर्ग्स) {SomeSubclass sub1 = नया SomeSubclass (गलत); के लिए (स्ट्रिंग एस: सब 1.गेटलिस्ट ()) System.out.println ("इससे पहले:" + s); SomeSubclass sub2 = नए SomeSubclass (सच); के लिए (स्ट्रिंग एस: सब 1.गेटलिस्ट ()) System.out.println ("बाद:" + s); } @ ओवरराइड सार्वजनिक शून्य addToList (स्ट्रिंग्स) {someList.add (एस); } @ ओवरराइड पब्लिक लिस्ट & lt; स्ट्रिंग & gt; GetList () {someList वापस; }}
पैकेज somepackage; पब्लिक क्लास SomeSubclass SomeClass {सार्वजनिक SomeSubclass (बूलियन एड) को बढ़ाता है {सुपर (जोड़); अगर (जोड़ें) this.addToList ("a"); }}
पैकेज somepackage; आयात करें java.util.ArrayList; आयात java.util.List; सार्वजनिक इंटरफेस कुछ इंटरफेस {सूची & lt; स्ट्रिंग & gt; SomeList = नए अर्रेसूची & lt; स्ट्रिंग & gt; (); सार्वजनिक शून्य addToList (स्ट्रिंग एस); सार्वजनिक सूची & lt; स्ट्रिंग & gt; getList (); }
के बाद: a
कुछ लिस्ट निहित है
स्थिर (और
अंतिम ) क्योंकि यह किसी अंतरफलक में परिभाषित है।
सार्वजनिक ,
स्थिर , और
final । इस तरह के क्षेत्रों के लिए किसी भी या सभी संशोधकों को नितांत रूप से निर्दिष्ट करने की अनुमति है।
someList का केवल एक उदाहरण है, इसलिए सभी कार्यान्वयन वर्ग
सार में बदलें वर्ग, ताकि
कुछ लिस्ट निहित नहीं है
स्थिर
someList
कुछ क्लास में इसलिए यह निहित नहीं है
स्थिर ।
Comments
Post a Comment