यदि किसी प्रकार की वापसी विधि शून्य है तो मैं क्या लौटाऊंगा? (शून्य नहीं!)


115

जावा में जेनेरिक के उपयोग के कारण मैं Voidरिटर्न प्रकार के रूप में होने वाले फ़ंक्शन को लागू करने में समाप्त हो गया :

public Void doSomething() {
    //...
}

और संकलक मांग करता है कि मैं कुछ वापस कर दूं । अभी के लिए मैं बस लौट रहा हूं null, लेकिन मैं सोच रहा हूं कि क्या अच्छा कोडिंग अभ्यास है ...

मैं V oid के बारे में पूछ रहा हूं , v oid नहीं । वर्ग Void, नहीं आरक्षित कीवर्ड void

मैं भी कोशिश की है Void.class, void, Void.TYPE, new Void(), सब पर कोई वापसी, लेकिन सभी कि सभी पर काम नहीं करता। (अधिक या कम स्पष्ट कारणों के लिए) ( विवरण के लिए यह उत्तर देखें)

  • यदि किसी प्रकार का रिटर्न फंक्शन है तो मुझे क्या करना चाहिए Void?
  • Voidकक्षा का सामान्य उपयोग क्या है ?

जवाबों:


104

तो अगर मुझे वापस लौटना है तो क्या होगा अगर किसी फंक्शन का रिटर्न टाइप होना है Void?

का उपयोग करें return nullVoidत्वरित नहीं किया जा सकता है और केवल Class<T>प्रकार के लिए एक प्लेसहोल्डर है void

किस बात का Void?

जैसा कि ऊपर उल्लेख किया गया है, यह एक प्लेसहोल्डर है। Voidउदाहरण के लिए, यदि आप एक वापसी प्रकार के साथ एक विधि को देखने के लिए प्रतिबिंब का उपयोग करते हैं, तो आपको क्या मिलेगा void। (तकनीकी रूप से, आपको वापस मिल जाएगा Class<Void>।) इन पंक्तियों के साथ इसके अन्य मिश्रित उपयोग हैं, जैसे कि यदि आप एक पैरामीटर बनाना चाहते हैं Callable<T>

जावा में जेनेरिक के उपयोग के कारण मैं इस फ़ंक्शन को लागू करने में समाप्त हो गया

मैं कहूंगा कि यदि आपके पास इस हस्ताक्षर के साथ एक विधि को लागू करने की आवश्यकता है, तो आपके एपीआई के साथ कुछ कायरता हो सकती है। ध्यान से विचार करें कि क्या आप चाहते हैं कि एक बेहतर तरीका है (शायद आप एक अलग, अनुवर्ती प्रश्न में अधिक विवरण प्रदान कर सकते हैं)। मुझे थोड़ा संदेह है, क्योंकि यह केवल "जेनरिक के उपयोग के कारण" आया था।


13
Void को वापस करना इतना मज़ेदार नहीं है। यह केवल कॉल करने योग्य <T> द्वारा अनिवार्य किया जा सकता है। कभी-कभी आपको बस कुछ वापस करने की आवश्यकता नहीं होती है, लेकिन उदाहरण के लिए Runnable का उपयोग नहीं किया जा सकता है।
बॉम्बे

जैसा कि मैंने उल्लेख किया है, शून्य के वैध उपयोग हैं। लेकिन उन्होंने कहा कि "यह केवल जेनरिक के उपयोग के कारण आया है"। यह ऐसा लगता है जैसे उसने एक संग्रह के लिए कुछ किया है जिसे शून्य का उपयोग करने की आवश्यकता है, जो मैं कहूंगा कि यह एक असाधारण मामला है।
जॉन फेमिनाला

संग्रह के साथ यह वास्तव में बहुत अजीब होगा।
बॉम्बे

Void.class और void.class दोनों क्लास <Void> हैं, लेकिन वे समान नहीं हैं। शून्य का उपयोग अक्सर मानचित्र के मूल्य में एक सामान्य तर्क के रूप में किया जाता है (या संग्रह का उपयोग करें। NewSetFromMap) और AccessController.doPrivileged की वापसी।
टॉम हॉल्टिन -

@ टॉम: येपर। इसलिए मैंने "(तकनीकी रूप से, आपको कक्षा <शून्य>" वापस मिल जाएगी) "क्या मुझे उस हिस्से में संशोधन करना चाहिए या क्या आपको लगता है कि यह सही है?
जॉन फेमिनेला

26

एक शून्य को तुरंत करने का कोई तरीका नहीं है, इसलिए केवल एक चीज जिसे आप वापस कर सकते हैं वह शून्य है।


13
अधिक सटीक रूप से, बुरी चीजें किए बिना एक शून्य को तुरंत करने का कोई तरीका नहीं है।
माइकल मायर्स


20

यह स्पष्ट करने के लिए कि आपके द्वारा दिए गए अन्य सुझाव क्यों काम नहीं करते हैं:

Void.classऔर Void.TYPEएक ही वस्तु की ओर इशारा करते हैं और प्रकार के होते हैं, प्रकार Class<Void>के नहीं Void

इसीलिए आप उन मूल्यों को वापस नहीं कर सकते। new Void()प्रकार का होगा, Voidलेकिन वह निर्माता मौजूद नहीं है। वास्तव में, Voidकोई सार्वजनिक निर्माणकर्ता नहीं है और इसलिए इसे तत्काल नहीं किया जा सकता है: आपके पास Voidबहुरूपी को छोड़कर किसी भी प्रकार की वस्तु नहीं हो सकती है null

उम्मीद है की यह मदद करेगा! :-)


1
मामूली सुधार: Void.TYPEइंगित नहीं करता है Void.class। यह इंगित करता है void.class
shmosel

1

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


मैं अभ्यस्त होना चाहिए; यह सिर्फ सम्मेलन है।
टॉम हॉल्टिन -

-2

सिर्फ इस तरह।

public Class TestClass {
    public void testMethod () {
        return;
    }
}

2
ओपी ने कहा Void, नहीं void। अन्य उत्तर पहले से ही विषय को अच्छी तरह से कवर करते हैं।
E_net4 मेटा
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.