2011-02-14 13 views
7

मैं @Deprecated एनोटेशन का उपयोग करके किसी वर्ग के भीतर मौजूद सभी विधियों और फ़ील्ड को केवल किसी दिए गए वर्ग का विस्तार नहीं करना चाहता हूं।केवल वर्ग विरासत को अस्वीकार करें

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

क्या जावा 1.6 (जेडीटी कंपाइलर) में यह संभव है?

+0

एक अद्यतन के रूप में अब तक दिए गए उत्तरों के रूप में - मुझे वर्गों को कक्षा का विस्तार जारी रखने की अनुमति देने की आवश्यकता है, क्योंकि मैं अभी तक निर्भरता को नहीं हटा सकता - लेकिन मैं चाहता हूं कि वे ऐसा करने पर बहिष्करण चेतावनियां प्राप्त करें। – BeeOnRope

+1

उत्तर के लिए धन्यवाद। अंत में, नीचे दिए गए समाधानों में से कोई भी पर्याप्त पर्याप्त नहीं था (अंतिम का उपयोग गैर-स्टार्टर है, क्योंकि मैं चेतावनी देना चाहता हूं, तोड़ना नहीं), इसलिए मैं संरक्षित रचनाकारों को बहिष्कृत करने के लिए बस गया जो उप-वर्गों का उपयोग करना चाहिए, जो समान था प्रभाव (प्रति एक्सटेंशन एक बहिष्करण चेतावनी)। – BeeOnRope

उत्तर

5

दो कारणों से

1) वर्ग पहले से ही बढ़ाया जा सकता है, तो यह अंतिम चिह्नित नहीं करते हैं या आप पश्च संगतता तोड़ सकते थे।

2) आप कक्षा को विस्तारित नहीं करना चाहते हैं, इसलिए इसे अंतिम चिह्नित किया जाना चाहिए।

मुझे लगता है कि आपको क्या करना चाहिए, पुरानी कक्षा को एक नई कक्षा के साथ बढ़ाएं, पुराने वर्ग को बहिष्कृत करें, और नए वर्ग के फाइनल की घोषणा करें। नई कक्षा में, आप बहिष्कृत संदेश को शांत करने के लिए @SuppressWarning टैग जोड़ सकते हैं, तो आपको एक साफ संकलन प्राप्त करना चाहिए।

पुरानी कक्षा का उपयोग करने वाले कोड को @ डेप्रेटेड चेतावनी मिलेगी, लेकिन अभी भी संकलित होगी .. नई कक्षा का उपयोग करके कोड साफ-सुथरा संकलित होगा। पिछड़े संगत ब्रेक की बजाय अपने उपयोगकर्ताओं को "मजबूत सुझाव" की तरह, और उनके लिए ठीक करना आसान है क्योंकि एपीआई 100% संगत है।

+0

इस उत्तर को चिह्नित करते हुए, जैसा कि मुझे आवश्यकतानुसार सबसे अधिक है - क्लास को विस्तारित करने के बारे में उपभोक्ताओं को चेतावनी देने का एक तरीका, वास्तव में उन्हें तोड़ने या प्रत्येक विधि के आमंत्रण पर चेतावनी के बिना। – BeeOnRope

4

मुझे संदेह है कि @Deprecated एनोटेशन का उपयोग करना संभव है।

आप नियंत्रण स्रोतों पर आप फिर भी निम्न कर सकता है:

  1. SomeClassSuper
  2. करने के लिए वर्तमान वर्ग SomeClass का नाम बदलें SomeClass नामक एक नया वर्ग बना सकते हैं और यह विस्तार SomeClassSuper करते हैं।
  3. SomeClass फ़ाइनल बनाएं (जो ग्राहकों को इसे विस्तारित करने से रोकता है)।

है यही कारण है, से

class SomeClass { 
    // ... 
} 

class SubClass extends SomeClass { 
    // ... 
} 

को

class SomeClassSuper { 
    // ... 
} 

class SubClass extends SomeClassSuper { 
    // ... 
} 

final class SomeClass extends SomeClassSuper { 
    // ... 
} 
+0

अच्छा विचार (+1)। – Bozho

1

नहीं, नहीं देते हैं। आप कक्षा final बना सकते हैं, लेकिन इस प्रकार आप मौजूदा एक्सटेंशन तोड़ देंगे।

शायद एपीटी के लिए एक कस्टम प्रोसेसर विकसित करना संभव है। लेकिन यह सामान्य मामले में लागू नहीं किया जाएगा।

0

@Deprecated एनोटेशन इसका समर्थन नहीं करता है, आपको इसके बजाय अपनी कक्षा final चिह्नित करना चाहिए। हालांकि यह एक कंपाइलर त्रुटि का कारण बनता है यह अधिक तार्किक है, या तो अपनी कक्षा को विस्तारित करना सुरक्षित है या यह करने में त्रुटि है।

1

यदि यह आपके डिज़ाइन को फिट करता है तो आप संभवतः आवश्यक कार्यक्षमता बना सकते हैं (उदाहरण के लिए जिन रचनाकारों को वंशजों तक पहुंच की आवश्यकता है), और संरक्षित + बहिष्कृत कन्स्ट्रक्टर प्रदान करें जो एक्सटेंशन को उपयोग करने की आवश्यकता होगी।

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