2011-08-24 8 views
22

को परिभाषित करने और वर्ग परिभाषा की शुरुआत में सदस्य चर initialising, और पहले सदस्य चर को परिभाषित करने और निर्माता में सदस्य चर initialising के बीच क्या अंतर है?कक्षा परिभाषा या कन्स्ट्रक्टर में शुरुआत में सदस्य चर शुरू करें?

कहते हैं, उदाहरण के लिए:

public class Test { 
    private int foo = 123; 
    private boolean flag = false; 

    public void fooMethod() {...} 
} 

बनाम:

public class Test { 
    private int foo; 
    private boolean flag; 

    public Test() { 
     foo = 123; 
     flag = false; 
    } 

    public void fooMethod() {...} 
} 

अग्रिम धन्यवाद।

+1

[संभव अभ्यास: कन्स्ट्रक्टर में कक्षाओं के क्षेत्र में शुरूआत या घोषणा में संभावित डुप्लिकेट?] (Http://stackoverflow.com/questions/24551/best-practice-initialize-class-fields-in-constructor-or-at - घोषणा) –

उत्तर

17

आपके उदाहरण में, केवल तभी अंतर होता है जब वे प्रारंभ होते हैं। जेएलएस के अनुसार, कन्स्ट्रक्टर कहने से पहले इंस्टेंस चर प्रारंभ किए जाते हैं। जब आप सुपर क्लास से निपटने के लिए होते हैं तो यह दिलचस्प हो सकता है, क्योंकि प्रारंभिक आदेश हमेशा इतना स्पष्ट नहीं होता है। इसके साथ, ध्यान रखें कि "सुपर" इंस्टेंस वैरिएबल तब भी प्रारंभ किए जाएंगे जब कोई स्पष्ट सुपर कन्स्ट्रक्टर नहीं कहा जाता है।

+0

+1 और मुझे लगता है कि सभी प्रकार की बग पेश करें जो ट्रैक करने के लिए अविश्वसनीय रूप से चुनौतीपूर्ण हैं ... –

5

अंतर वह क्रम है जिसमें वे प्रारंभ/सेट हैं।

आपके क्लास सदस्य चर को आपके कन्स्ट्रक्टर कहने से पहले घोषित/सेट किया जाएगा। मेरा निजी वरीयता उन्हें कन्स्ट्रक्टर में सेट करना है।

0

आमतौर पर एक निर्माता तर्क स्वीकार करेगा और कक्षा के क्षेत्रों में उन तर्कों को असाइन करेगा।

public Test(int foo, boolean flag) 
{ 
    this.foo = foo; 
    this.flag = flag; 
} 
+0

यकीन नहीं है कि आपका क्या मतलब है? –

+0

@ एआईबी, यह जावा है, सी ++ नहीं। – Triang3l

2

इन-क्लास प्रारंभिकरण आपको एक छोटे से कन्स्ट्रक्टर लिखने से बचने की अनुमति देता है।

आपको इंस्टेंस सदस्यों को प्रारंभ करना होगा जो कन्स्ट्रक्टर के अंदर कन्स्ट्रक्टर पैरामीटर पर निर्भर करते हैं। पठनीयता के लिए यह उचित हो सकता है, अगर कुछ और नहीं, तो उसी कन्स्ट्रक्टर के अंदर अन्य सभी इंस्टेंस सदस्यों को प्रारंभ करने के लिए।

अन्यथा, कोई अंतर नहीं है।

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