2010-05-14 11 views
6

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

उत्तर

8

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

+0

विकल्प प्रदान करने के लिए धन्यवाद!यही वह था जो मैं विचार कर रहा था - मैं जटिलता में इसकी लागत का वजन कर रहा था (कार्यान्वयन के संदर्भ को बनाए रखना और इसे सौंपना) लेकिन चूंकि यह प्लग करने योग्य वास्तुकला एक आवश्यकता है, मैं यह करूँगा। – thSoft

2

निश्चित रूप से।

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

आप वर्ग जो गंदगी क्रमबद्धता आदि

5

मुझे लगता है कि आप तकनीकी अर्थ में "बाइनरी असंगतता" का उपयोग कर रहे हैं; जैसे जहां क्लासलोडर असंगतता का पता लगाता है और कक्षाओं को लोड करने से इंकार कर देता है।

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

इसी तरह, नए दृश्य फ़ील्ड जोड़ने से परिणाम छिप जाएंगे, परिणामस्वरूप भ्रमित व्यवहार हो सकता है और ऑब्जेक्ट क्रमबद्धता टूट जाएगी। लेकिन इसका परिणाम बाइनरी असंगतता नहीं होगी।

आम तौर पर यह इस तथ्य को इंगित करता है कि आपको आवेदन अर्थपूर्ण मुद्दों के साथ-साथ सरल बाइनरी संगतता पर विचार करने की आवश्यकता है। और जावा टाइप सिस्टम आपको वहां मदद नहीं करेगा।

  • अपने अमूर्त वर्ग और/या उसके तरीकों की दृश्यता को कम करने,
  • :

    पूर्णता के लिए, वहाँ एक अन्य चीजें हैं जो आप अपने कोड में कर सकता है कि 3 पार्टी कक्षाओं के लिए दोहरी संगतता टूट जाएगा रहे हैं

  • परिवर्तन पैरामीटर परिणाम और अपवाद प्रकार के रूप में इस्तेमाल अन्य वर्गों के हस्ताक्षर,
  • परिवर्तन सुपर-क्लास की श्रृंखला है कि अपने सार वर्ग फैली हुई है, या उन कक्षाओं में एक असंगत परिवर्तन करते हैं, या
  • परिवर्तन इंटरफेस टी का पेड़ अपने अमूर्त वर्ग के उपकरण को टोपी करें, या उन इंटरफेस में एक असंगत परिवर्तन करें।
+0

व्यापक उत्तर के लिए धन्यवाद, और मैंने जो भी सोचा था, उसके बारे में सोचने के लिए लेकिन वर्णन नहीं किया, अर्थात् कार्यान्वयनकर्ता कोड को तोड़ने के किसी भी अन्य तरीके। – thSoft

+0

अच्छा जवाब। बाइनरी और स्रोत संगतता के नियम एक-दूसरे से बहुत स्वतंत्र हैं। अलग-अलग दोनों को समझना महत्वपूर्ण है। http://motlin.com/2010/binary-and-source-backwards-compatibility/ –

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