दूसरे शब्दों में, आपको एक उदाहरण इनिशियलाइज़र की आवश्यकता क्यों होगी? एक रचनाकार पर एक उदाहरण इनिशियलाइज़र लिखने में आपको क्या अंतर या फायदा होता है?
जवाबों:
यह इसे अच्छी तरह से समझाता है:
इंस्टेंस इनिशियलाइज़र जब भी वैरिएबल इनिशियलाइज़र्स का उपयोग करने के लिए एक उपयोगी विकल्प होते हैं:
initializer कोड अपवादों को पकड़ना चाहिए, या
फैंसी गणना करें जो एक उदाहरण चर आरंभीकरण के साथ व्यक्त नहीं की जा सकती हैं। आप निश्चित रूप से, इस तरह के कोड को हमेशा रचनाकारों में लिख सकते हैं।
लेकिन एक ऐसे वर्ग में, जिसके कई निर्माता थे, आपको प्रत्येक निर्माता में कोड दोहराना होगा। एक उदाहरण इनिशलाइज़र के साथ, आप बस एक बार कोड लिख सकते हैं, और यह निष्पादित किया जाएगा कि कोई फर्क नहीं पड़ता कि निर्माणकर्ता का उपयोग ऑब्जेक्ट बनाने के लिए क्या किया जाता है। इंस्टेंस इनिशियलाइज़र अनाम आंतरिक वर्गों में भी उपयोगी होते हैं, जो किसी भी निर्माता को बिल्कुल भी घोषित नहीं कर सकते हैं।
से: Java में JavaWorld Object initialization ।
वस्तु जीवनचक्र के संदर्भ में, कोई अंतर नहीं है। दोनों का निर्माण समय पर किया जाता है, और तार्किक रूप से प्रारंभिक ब्लॉक को निर्माण का हिस्सा माना जा सकता है।
शब्दार्थ, एक इनिलाइज़र कई कारणों से एक अच्छा उपकरण है:
आरंभीकरण को चर के आरंभ के बगल में आरंभीकरण तर्क रखकर कोड पठनीयता में सुधार कर सकते हैं:
public class Universe {
public int theAnswer;
{
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
}
// a bunch of other vars
}
बनाम
public class Universe {
public int theAnswer;
// a bunch of other vars
public Universe() {
int SIX = 6;
int NINE = 7;
theAnswer = SIX * NINE;
// other constructor logic
}
}
इनिशियलाइज़र्स को इनवाइट किया जाता है, भले ही कंस्ट्रक्टर का इस्तेमाल किया जाए।
शुरुआती का उपयोग अनाम आंतरिक कक्षाओं में किया जा सकता है, जहां निर्माणकर्ता नहीं कर सकते।
theAnswer
एक घोषित उदाहरण चर है। यह एक अनाम इनिशियलाइज़र ब्लॉक में आरंभिक है। चर घोषणा के बाद अर्धविराम पर ध्यान दें।
जब आपके पास कई कंस्ट्रक्टर होते हैं और चाहते हैं कि प्रत्येक कंस्ट्रक्टर के लिए कुछ सामान्य कोड निष्पादित किए जाएं तो आप उदाहरण इनिशलाइज़र का उपयोग कर सकते हैं। ऐसा सभी कंस्ट्रक्टरों के लिए कहा जाता है।
मैं सामान्य रूप से उदाहरण इनिलाइज़र मुहावरे से बचता हूँ - केवल एक ही वास्तविक लाभ जो वैरिएबल इनिशियलाइज़र्स को देता है वह है अपवाद हैंडलिंग।
और चूंकि एक init मेथड (कंस्ट्रक्टर से कॉल करने योग्य) अपवाद हैंडलिंग भी कर सकता है और कंस्ट्रक्टर सेटअप कोड को भी केंद्रीकृत करता है, लेकिन इसका फायदा यह है कि यह कंस्ट्रक्टर पैरामीटर मानों पर काम कर सकता है, मैं कहूंगा कि उदाहरण इनिशियलाइज़र बेमानी है, और इसलिए टाल गए।
ऑब्जेक्ट निर्माण के समय, यदि हम उदाहरण चर का आरंभ करना चाहते हैं, तो हमें कंस्ट्रक्टर के लिए जाना चाहिए, प्रारंभिक गतिविधि के अलावा यदि हम ऑब्जेक्ट निर्माण के समय कोई गतिविधि करना चाहते हैं तो हमें उदाहरण ब्लॉक के लिए जाना चाहिए।
हम कंस्ट्रक्टर को इंस्टेंस ब्लॉक से रिप्लेस नहीं कर सकते क्योंकि कंस्ट्रक्टर तर्क ले सकता है लेकिन इंस्टेंस ब्लॉक तर्क नहीं ले सकता।
हम उदाहरण ब्लॉक wih कंस्ट्रक्टर को प्रतिस्थापित नहीं कर सकते क्योंकि एक वर्ग में एक से अधिक कंस्ट्रक्टर हो सकते हैं। अगर हम इंस्ट्रूमेंट को कंस्ट्रक्टर से बदलना चाहते हैं तो हर कंस्ट्रक्टर में हमें इंस्टेंस ब्लॉक लिखना होगा क्योंकि रनटाइम के दौरान कंस्ट्रक्टर को हम उम्मीद नहीं कर सकते हैं, यह डुप्लिकेट कोड को अनावश्यक रूप से बढ़ा देगा।
उदाहरण :
class MyClass{
static int object_count = 0;
MyClass(){
object_count++;
}
MyClass(int i){
object_count++;
}
void getCount() {
System.out.println(object_count);
}
public static void main(String... args) {
MyClass one = new MyClass();
MyClass two = new MyClass(2);
two.getCount();
}
}
आउटपुट: 2
class MyClass{
static int object_count = 0;
{
object_count++;
}
MyClass(){
}
MyClass(int i){
}
void getCount() {
System.out.println(object_count);
}
public static void main(String... args) {
MyClass one = new MyClass();
MyClass two = new MyClass(2);
two.getCount();
}
}
आउटपुट: 2
इनिशिएटिव, कंस्ट्रक्टर्स के बीच कोड साझा करने का तरीका है और यह वैरिएबल डिक्लेरेशन के साथ इनिशियलाइज़र का उपयोग करने पर कोड को अधिक पठनीय बनाता है।
जावा कंपाइलर हर कंस्ट्रक्टर में इनिशियलाइज़र ब्लॉक को कॉपी करता है। इसलिए, इस दृष्टिकोण का उपयोग कई बिल्डरों के बीच कोड के एक ब्लॉक को साझा करने के लिए किया जा सकता है। ओरेकल प्रलेखन