2016-04-06 10 views
9

प्रभावी जावा 2 संस्करण, मद 17 से:विरासत की योजना बनाते समय, क्या रचनाकारों को अतिरंजित विधि कॉल करने की अनुमति है?

प्रत्येक सार्वजनिक या संरक्षित विधि या निर्माता के लिए, दस्तावेज़ीकरण संकेत देना चाहिए जो overridable तरीकों विधि या निर्माता invokes ही में

बाद में आइटम यह कहता है:

रचनाकारों को प्रत्यक्ष या परोक्ष रूप से ओवरराइड करने योग्य तरीकों का आह्वान नहीं करना चाहिए।

क्या ये दो बयान विरोधाभासी नहीं हैं, या क्या मुझे कुछ याद आ रहा है?

+0

आप इसे एक ऐसे अर्थ में पढ़ सकते हैं जो गैर-विरोधाभासी है: यह वैक्यूओसली सच हो सकता है कि एक कन्स्ट्रक्टर का दस्तावेज सभी ओवरराइड करने योग्य तरीकों को इंगित करता है, अगर शून्य अतिरंजित तरीकों का आह्वान किया जाता है। लेकिन मुझे संदेह है कि यह वह भावना नहीं है जिसमें लिखा गया था, न ही वह जिसका अर्थ है :) –

+0

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

उत्तर

1

निर्माण के दौरान अतिरंजनीय तरीकों का आह्वान स्वीकृत - इसके बारे में कुछ भी गैरकानूनी नहीं है।

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

public class A { 

    final int a; 

    public A() { 
     a = method(); 
    } 

    protected int method() { 
     return 42; 
    } 

    @Override 
    public String toString() { 
     return "A{" + "a=" + a + '}'; 
    } 

} 

public class B extends A { 

    @Override 
    protected int method() { 
     System.out.println("this=" + this); 
     return 96; 
    } 

} 

public void test() { 
    System.out.println("B = " + new B()); 
} 

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

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

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