2013-03-04 13 views
7

जहाँ तक मुझे पता है, निर्माता वापसी कुछ भी, यहां तक ​​कि शून्य नहीं,कन्स्ट्रक्टर के भीतर रिटर्न स्टेटमेंट को कैसे समझाया जाए?

और भी

return ; 

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

तो मेरे कार्यक्रम

public class returnTest { 

    public static void main(String[] args) { 
     returnTest obj = new returnTest(); 
     System.out.println("here1"); 

    } 

    public returnTest() 
    { 
     System.out.println("here2"); 
     return ; 
    } 
    } 

में मैं

return; 

जो शून्य लौटने दिया जाएगा बोल रहा हूँ, लेकिन निर्माता कुछ भी वापस करने की अपेक्षा की नहीं है, कार्यक्रम ठीक संकलित करता है।

कृपया समझाएं।

+6

क्या आपने जावा नाम सम्मेलनों के बारे में सुना है? –

+1

प्रोग्राम बिल्कुल संकलित नहीं करता है: यह एक पहुंचने योग्य कथन के लिए एक संकलन त्रुटि देता है। – EJP

+1

@EJP: अरे, जो अनजान था, आखिरी पंक्ति जिसे मैंने अभी गलती से लिखा था, यह –

उत्तर

15

return एक निर्माता में बस निर्दिष्ट बिंदु पर निर्माता से बाहर कूदता है। यदि आप कुछ परिस्थितियों में कक्षा को पूरी तरह से प्रारंभ करने की आवश्यकता नहीं है तो आप इसका उपयोग कर सकते हैं।

उदा।

// A very contrived example... 
class Demo 
{ 
    protected int id = 0; 
    protected int count = 0; 
    public Demo(int id, int count) 
    { 
     this.id = id; 
     this.count = count; 
     if (this.count <= 0) { 
      return; 
     } 
     // count > 0, do something meaningful 
1

void रिटर्न प्रकार के साथ घोषित तरीके के साथ-साथ कन्स्ट्रक्टर कुछ भी वापस नहीं लौटाते हैं। यही कारण है कि आप उनमें से return कथन छोड़ सकते हैं। कारण है कि void वापसी प्रकार निर्माताओं के लिए निर्दिष्ट नहीं है ही नाम के साथ विधि से निर्माता भेद करने के लिए है: के बाद वापसी बयान

public class A 
{ 
    public A() // This is constructor 
    { 
    } 

    public void A() // This is method 
    { 
    } 
} 
1

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

आप की अगर हालत पूर्व आधार पर निर्माता में कुछ प्रारंभ कर रहे हैं।, आप डेटाबेस कनेक्शन प्रारंभ करने में चाहते हो सकता है अगर यह उपलब्ध हो और बाकी लौट आप अस्थायी के लिए स्थानीय डिस्क से डेटा को पढ़ने के लिए चाहते हैं उद्देश्य।

public class CheckDataAvailability 
{ 
    Connection con =SomeDeligatorClass.getConnection(); 

    public CheckDataAvailability() //this is constructor 
    { 
     if(conn!=null) 
     { 
      //do some database connection stuff and retrieve values; 
      return; // after this following code will not be executed. 
     } 

     FileReader fr; // code further from here will not be executed if above 'if' condition is true, because there is return statement at the end of above 'if' block. 

    } 
} 
+2

अन्यथा उस बिंदु पर निष्पादित नहीं किया जाएगा –

2

return निर्माता तुरंत छोड़ने के लिए इस्तेमाल किया जा सकता। लगता है कि एक उपयोग मामला आधा प्रारंभिक वस्तुओं को बनाने के लिए प्रतीत होता है।

कोई तर्क दे सकता है कि यह एक अच्छा विचार है या नहीं। समस्या आईएमएचओ यह है कि परिणामस्वरूप वस्तुओं को काम करना मुश्किल होता है क्योंकि उनके पास कोई भी आविष्कार नहीं है जिस पर आप भरोसा कर सकते हैं।

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

मैंने देखा है कि एक और पैटर्न कन्स्ट्रक्टर में नियंत्रक तर्क लागू किया गया है। यदि एक रीडायरेक्ट आवश्यक था, तो कन्स्ट्रक्टर ने रीडायरेक्ट को संग्रहीत किया और वापस लौटा दिया।इसके अलावा कि इन रचनाकारों को परीक्षण करना भी मुश्किल था, बड़ी समस्या यह थी कि जब भी ऐसी वस्तु के साथ काम करना पड़ता है, तो आपको निराशाजनक रूप से यह मानना ​​होगा कि यह पूरी तरह शुरू नहीं हुआ है।

रचनाकारों से सभी तर्कों को बेहतर रखें और पूरी तरह से प्रारंभिक, छोटी वस्तुओं के लिए लक्ष्य रखें। फिर आप शायद ही कभी (अगर कभी) किसी निर्माता में return पर कॉल करने की आवश्यकता होगी।

1

इस मामले में returnbreak के समान कार्य करता है। यह प्रारंभिकता समाप्त होता है। उस श्रेणी की कल्पना करें जिसमें int var है। आप int[] values पास करते हैं और को values (या var = 0 अन्यथा) में संग्रहीत int पर var प्रारंभ करना चाहते हैं। फिर आप return का उपयोग कर सकते हैं।

public class MyClass{ 

int var; 

public MyClass(int[] values){ 
    for(int i : values){ 
     if(i > 0){ 
      var = i; 
      return; 
     } 
    } 
} 
//other methods 
} 
संबंधित मुद्दे