@Voo कहते हैं,
अपने प्रश्न पहले से ही एक पूरी तरह से निर्माण किया वस्तु पर एक आभासी विधि बुला के बारे में है। निर्माण वस्तु के लिए पर आभासी तरीकों को बुलाने की अच्छी तरह से ज्ञात पतन अच्छी तरह से जाना जाता है, लेकिन यहाँ
लागू नहीं है Effective Java 2nd Edition से, मद 17: डिजाइन और विरासत के लिए दस्तावेज़, वरना यह निषेध :
वहाँ कुछ और प्रतिबंध है कि एक वर्ग विरासत अनुमति देने के लिए का पालन करना चाहिए रहे हैं। रचनाकारों को सीधे या परोक्ष रूप से अतिरंजित विधियों, का आह्वान नहीं करना चाहिए। यदि आप इस नियम का उल्लंघन करते हैं, तो प्रोग्राम विफलता परिणाम होगा। सुपरक्लास कन्स्ट्रक्टर उपclass कन्स्ट्रक्टर से पहले चलता है, इसलिए उपclass कन्स्ट्रक्टर चलाने से पहले उपclass में ओवरराइडिंग विधि लागू की जाएगी। अगर ओवरराइडिंग विधि सबक्लास निर्माता, द्वारा किए गए किसी भी प्रारंभिकरण पर निर्भर करता है, तो विधि अपेक्षित व्यवहार नहीं करेगी।
ऑब्जेक्ट निर्माण के दौरान एक अतिरंजित विधि के आमंत्रण के परिणामस्वरूप अनियमित डेटा का उपयोग हो सकता है, जिससे रनटाइम अपवाद या अप्रत्याशित परिणामों तक पहुंच हो सकती है।
कंस्ट्रक्टर्स केवल तरीकों कि अंतिम या निजी
आप स्थिर कारखाने तरीकों का उपयोग कर सकता है समस्या आप Bar class
से अपने वस्तुओं को बनाने के लिए है कि ठीक करने के लिए कर रहे हैं आह्वान करना होगा।
प्रभावी जावा, आइटम 1: विचार करें कंस्ट्रक्टर्स
एक वर्ग एक ग्राहक का एक उदाहरण अपने आप में एक सार्वजनिक निर्माता प्रदान करना है प्राप्त करने के लिए अनुमति देने के लिए के लिए सामान्य तरीके के बजाय स्थिर कारखाने तरीकों। एक और तकनीक है जो प्रत्येक प्रोग्रामर टूलकिट का हिस्सा होना चाहिए। एक वर्ग एक सार्वजनिक स्थैतिक फैक्ट्री विधि प्रदान कर सकता है, जो कि बस एक स्थिर विधि है जो कक्षा का एक उदाहरण देता है।
public interface Foo {
void doFoo();
}
और कार्यान्वयन:
public class FooImpl implements Foo {
@Override
public void doFoo() {
//.. Do important code
}
}
अपने कारखाने विधि के साथ अपने वर्ग बनाने के लिए आप इस तरह से काम कर सकता था:
तो, आप इंटरफेस के लिए जाना
चर के परिभाषित करने के लिए इंटरफ़ेस का उपयोग करें private FooImpl fi
के बजाय आपकी कक्षा private Foo fi
, कंक्रीट प्रकारों पर इंटरफेस का उपयोग करके अच्छा encapsulation और आपके कोड को ढीला करने के लिए कुंजी है।
अपने डिफ़ॉल्ट कन्स्ट्रक्टर को निजी बनाएं ताकि आपकी कक्षा के बाहर तत्कालता को रोक सके।
निजी बार()
सभी तरीकों है कि अपने निर्माता में मौजूद हैं ओवरराइड करने के लिए कहता है निकालें { // इन्स्टेन्शियशन रोकता है}।
अपने स्थिर कारखाने पद्धति बनाएं
अंत में आप की तरह एक कारखाने विधि के साथ एक वर्ग Bar
मिलती है:
public class Bar {
private Foo fi;
private Bar() {// Prevents instantiation
fi = new FooImpl();
}
public static Bar createBar() {
Bar newBar = new Bar();
newBar.fi.doFoo();
return newBar;
}
}
मेरे बॉस कहते हैं: "सोनार चेतावनी के बारे में लक्षण कर रहे हैं, रोग के बारे में नहीं। जब आप बीमारी का इलाज कर सकते हैं तो यह सबसे अच्छा है। "
जो कोड आपने दिखाया है वह ओवरराइड करने योग्य विधि * को * कन्स्ट्रक्टर कहलाता है, कन्स्ट्रक्टर * से नहीं, सही कह रहा है? या क्या मैं कुछ न कुछ भूल रहा हूं? – NPE
कोड दिखा रहा है जो वास्तव में चेतावनी को रोकता है शायद एक अच्छा विचार होगा .. – Voo
aix- यह संदेश उठा रहा है क्योंकि बार बार के कन्स्ट्रक्टर के अंदर fi.doFoo() को कॉल कर रहा है। वू - कोड कॉपी/पेस्ट करने के लिए बहुत लंबा तरीका है। यह – user973479