2012-05-28 8 views
9

संभव डुप्लिकेट:
what happens to an object in Java if you do not reference it, like here : myString.concat(“that”)किसी चर के लिए विधि का रिटर्न मान असाइन करना क्यों आवश्यक नहीं है?

public class ReturnTest 
{ 
    public static void main(String[] args) 
    { 
     ReturnTest rt = new ReturnTest(); 
     rt.show(); 
    } 

    public String show() 
    { 
     return "Hello"; 
    } 
} 

उपरोक्त कोड में show() विधि एक String मूल्य है जो किसी भी चर द्वारा कब्जा कर लिया नहीं है देता है। न तो संकलक और न ही JVM किसी भी चेतावनी, त्रुटि या अपवाद को बढ़ाता है। आदिम रिटर्न प्रकारों के लिए भी यही सच है। क्यूं कर?

क्या कंपाइलर यह सुनिश्चित नहीं करना चाहिए कि इस विधि द्वारा किसी भी महत्वपूर्ण मूल्य को वापस नहीं किया जाए?

मैं इसे खोल से कैसे ठीक कर सकता हूं ??

+1

क्या होगा यदि आप एक चर के लिए मान असाइन करते हैं लेकिन इसकी जांच नहीं करते हैं? क्या होगा यदि आप इसकी जांच करते हैं, लेकिन उस परीक्षा के आधार पर "सही" निर्णय न लें? संकलक "सही" चीज़ कर रहा है इससे पहले, आप इसे कितना लेना चाहते हैं? –

उत्तर

10

यह भाषा का डिज़ाइन है।

कई मामलों में, विधियां उस मान को लौटाती हैं जिसकी आपको परवाह नहीं है। उदाहरण के लिए StringBuilder.append() वस्तु को स्वयं लौटाता है।

यह सच है कि कुछ मामलों में एक महत्वपूर्ण वापसी मूल्य खो सकता है। उदाहरण के लिए, InputStream.skip(long n) छोड़े गए बाइट्स की संख्या देता है। और read बाइट्स पढ़ने की संख्या देता है। कुछ टूल्स हैं (Checkstyle, FindBugs) जो ऐसी बग का पता लगाते हैं। लेकिन भाषा ही वापसी मूल्य की जांच का अनुरोध नहीं करती है। और यहां तक ​​कि अगर ऐसा होता है, तो प्रोग्राम मूल्य को अनदेखा करना चुन सकता है।

+0

मैं किसी भी आईडीई का उपयोग नहीं कर रहा हूं, मैं इसे खोल के माध्यम से कैसे ठीक कर सकता हूं ?? – WickeD

+2

आप कमांड लाइन पर या बिल्ड के हिस्से के रूप में चेकस्टाइल और FindBugs चला सकते हैं। लेकिन, आप सिर्फ आईडीई का उपयोग क्यों नहीं करते? –

3

क्योंकि आपको जरूरी मूल्य की आवश्यकता नहीं है।

+0

मेरा सवाल यह है कि जावा ने कैसे सोचा कि हमें लौटाए गए मूल्य की आवश्यकता नहीं है? – WickeD

+0

यह नहीं करता है। यह सिर्फ असाइन नहीं किया गया है। – Bozho

+2

यह माना जाता है कि प्रोग्रामर जानता है कि वे क्या कर रहे हैं। अगर वे लौटे हुए मूल्य को स्टोर नहीं करते हैं, तो उन्हें इसकी आवश्यकता नहीं थी। –

1

जावा कार्यों में शुद्ध नहीं हैं, इसलिए वे केवल साइड इफेक्ट्स के लिए चलाए जा सकते हैं। यह सिर्फ इस मामले में कोई दुष्प्रभाव होते हैं में है ... पर विचार करें

public String show() { 
    System.out.println("Hello"); 
    return "Hello"; 
} 

अब आप एक चेतावनी चाहेगा? कंपाइलर यह नहीं जान सकता कि क्या आप इसे साइड इफेक्ट या वैल्यू के लिए चला रहे हैं, तो क्यों जोर देते हैं?

3

यदि आप इसके वापसी मूल्य का हमेशा उपयोग किया जाना चाहिए, तो आप @CheckReturnValue के साथ एक विधि को एनोटेट कर सकते हैं। FindBugs जैसे स्टेटिक कोड विश्लेषण इस एनोटेशन पर विचार करते हैं और जब आप इसका उल्लंघन करते हैं तो चेतावनी बढ़ाते हैं।

कम से कम यह बहुत उचित है जब विधि किसी प्रकार की ऑब्जेक्ट देता है जिसके लिए अंतिम प्रक्रिया की आवश्यकता होती है जहां कॉलर जिम्मेदार होता है। यह संसाधनों के लिए सच है जो अंत में बंद होना चाहिए। ताले जो अंत में जारी किए जाने चाहिए ...