एक शून्य वस्तु लौटाना


113

एक Voidप्रकार की वापसी का सही तरीका क्या है , जब यह एक आदिम नहीं है? उदाहरण के लिए। मैं वर्तमान में नीचे के रूप में अशक्त का उपयोग करता हूं।

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something
        return null;
    }
}

1
मैं एक फ़ाइल प्रारूप के लिए दुभाषिया लिख ​​रहा हूं, दुभाषिया पैटर्न का उपयोग कर रहा हूं, लेकिन कुछ अभिव्यक्तियों में रिटर्न मान नहीं है
रॉबर्ट

2
शून्य प्रकार को त्वरित करने का कोई तरीका नहीं है, इसलिए यदि आपको वास्तव में उस प्रकार का कुछ वापस करना है, तो नल आपका एकमात्र विकल्प है। हालाँकि, आपको संभवतः किसी भी चीज़ के लिए दिए गए मान की आवश्यकता नहीं है, इसलिए अशक्त होना चाहिए।
जोर्न

हाँ, यह मेरा तर्क भी था - बस आश्चर्य था कि अगर कोई अधिक अर्थपूर्ण तरीका था
रॉबर्ट

1
मैं इसे आपके उदाहरण की तरह कोड करूंगा। यह एक अच्छा तरीका है।
डेविड रसेल

जवाबों:


134

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

तो निम्नलिखित में से कोई भी पर्याप्त होगा:

  • के साथ Objectऔर वापसी new Object()याnull
  • के साथ Voidऔर वापस लौटते हुएnull
  • NullObjectतुम्हारा के साथ पैरामीटर

आप यह विधि नहीं बना सकते हैं void, और कुछ और कुछ भी देता है । चूंकि कुछ को नजरअंदाज किया जाता है, आप कुछ भी वापस कर सकते हैं।


2
फिर एक वापसी प्रकार के शून्य को प्राप्त करने का सामान्य रूप से सही तरीका क्या है?
रॉबर्ट

1
यदि आप शून्य को शून्य के रूप में वापस करना चाहते हैं, तो आपको इसे कुछ मामलों में डालना होगा: (शून्य) शून्य
पैट्रिक फेवर

return (Void)null;
एलेक्स आर

(शून्य) शून्य को किसी भी तरह से अशक्त से अलग किया जा सकता है?
Orangle

13

जावा 8 ने एक नया वर्ग पेश किया है Optional<T>, जिसका उपयोग ऐसे मामलों में किया जा सकता है। इसका उपयोग करने के लिए, आप अपना कोड इस प्रकार थोड़ा संशोधित करेंगे:

interface B<E>{ Optional<E> method(); }

class A implements B<Void>{

    public Optional<Void> method(){
        // do something
        return Optional.empty();
    }
}

यह आपको यह सुनिश्चित करने की अनुमति देता है कि आपको हमेशा अपने तरीके से एक गैर-अशक्त वापसी मूल्य मिलता है, यहां तक ​​कि जब वापसी के लिए कुछ भी नहीं है। यह विशेष रूप से शक्तिशाली है जब उपकरणों के साथ संयोजन में उपयोग किया जाता है जो यह पता लगाता है कि कब nullऔर नहीं लौटाया जा सकता है, जैसे कि ग्रहण @NonNullऔर @Nullableएनोटेशन।


5
मेरी राय है कि यह गलत दिशा में जा रहा है। बहुत अधिक विवश प्रकार को वापस करना बेहतर है जो अर्थ को बहुत स्पष्ट करता है। कुछ ऐसा होना जो रिटर्न देता Optional<Void>है, उसी कारण से अनावश्यक है जो आप देते हैं, आपको हमेशा एक Optional<Void>ऐसा मिलता है जो खाली है और इसलिए अन्य सभी तरीके व्यर्थ हैं। यह इसके विपरीत है कि वैकल्पिक मूल्य का उपयोग क्यों किया जाना चाहिए। आप इसका उपयोग करते हैं क्योंकि इसका कोई मान हो सकता है या नहीं। इसके अलावा कंपाइलर इसे लागू नहीं कर सकता है जो method()इसे सही तरीके से लागू करता है। यह रनटाइम में विफल होगा return Optional.of(null):।
२०:

3

यदि आपको अपने प्रकार के रूप में कुछ भी नहीं चाहिए, तो आप शून्य का उपयोग कर सकते हैं। इसका उपयोग कार्यों, या कार्यों को लागू करने के लिए किया जा सकता है। आप तब कुछ ऐसा कर सकते थे:

interface Action<T> {
    public T execute();
}

abstract class VoidAction implements Action<Void> {
    public Void execute() {
        executeInternal();
        return null;
    }

    abstract void executeInternal();
}

या आप अमूर्त वर्ग को छोड़ सकते हैं, और हर क्रिया में वापसी शून्य कर सकते हैं जिसके लिए स्वयं वापसी मूल्य की आवश्यकता नहीं है।

फिर आप इस तरह के कार्यों का उपयोग कर सकते हैं:

एक विधि दी

private static <T> T executeAction(Action<T> action) {
    return action.execute();
}

आप इसे पसंद कर सकते हैं

String result = executeAction(new Action<String>() {
    @Override
    public String execute() {
        //code here
        return "Return me!";
    }
});

या, शून्य कार्रवाई के लिए (ध्यान दें कि आप कुछ भी करने के लिए परिणाम नहीं दे रहे हैं)

executeAction(new VoidAction() {
    @Override
    public void executeInternal() {
        //code here
    }
});

2
यह मेरे पहले से ही अलग कैसे है? यह अभी भी अशक्त है, जैसा कि मैंने सुझाव दिया
रॉबर्ट

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

1

बस इसके लिए, निश्चित रूप से Voidप्रतिबिंब का उपयोग करके उदाहरण बनाने की संभावना है :

interface B<E>{ E method(); }

class A implements B<Void>{

    public Void method(){
        // do something

        try {
            Constructor<Void> voidConstructor = Void.class.getDeclaredConstructor();
            voidConstructor.setAccessible(true);
            return voidConstructor.newInstance();
        } catch (Exception ex) {
            // Rethrow, or return null, or whatever.
        }
    }
}

आप शायद उत्पादन में ऐसा नहीं करेंगे।


0

कोई सामान्य प्रकार नहीं है जो संकलक को बताएगा कि एक विधि कुछ भी नहीं लौटाती है।

मेरा मानना ​​है कि कन्वेंशन एक प्रकार के पैरामीटर के रूप में विरासत में आने पर ऑब्जेक्ट का उपयोग करना है

या

प्रकार के पैरामीटर को बढ़ाएं और फिर अपने वर्ग के उपयोगकर्ताओं को ऑब्जेक्ट का उपयोग करके इंस्टेंट करने दें और ऑब्जेक्ट को टाइप-वाइल्डकार्ड का उपयोग करके टाइप किए गए चर पर असाइन करें ?:

interface B<E>{ E method(); }

class A<T> implements B<T>{

    public T method(){
        // do something
        return null;
    }
}

A<?> a = new A<Object>();

1
क्या यह रिटर्न जेनरिक के साथ शून्य प्रकार सेट करने के लिए सम्मेलन है - यह मुझे बहुत शून्य नहीं लगता है?
राबर्ट

मेरा मानना ​​है कि यह रास्ता है। वर्ग का कोई भी उपयोगकर्ता A<?>लौटाए गए मान का कोई उपयोग नहीं कर पाएगा method()
क्रिस्टोफर Oezbek
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.