जावा शून्य संदर्भ प्रकार के लिए उपयोग करता है?


163

एक जावा Void- अपरकेस V-- संदर्भ प्रकार है । केवल स्थिति मैंने कभी देखा है यह प्रयोग किया जाता parameterize करने के लिए है Callableरों

final Callable<Void> callable = new Callable<Void>() {
            public Void call() {
                foobar();
                return null;
            }
        };

क्या जावा Voidसंदर्भ प्रकार के लिए कोई अन्य उपयोग हैं ? क्या इसके अलावा कभी भी कुछ भी सौंपा जा सकता है null? यदि हाँ, तो क्या आपके पास उदाहरण हैं?



जवाबों:


116

Voidएक सामान्य तर्क के लिए सम्मेलन बन गया है जिसमें आप रुचि नहीं रखते हैं। कोई कारण नहीं है कि आपको किसी अन्य गैर-तात्कालिक प्रकार का उपयोग करना चाहिए, जैसे कि System

इसका उपयोग अक्सर उदाहरण Mapमानों के लिए भी किया जाता है (हालाँकि मानचित्रों Collections.newSetFromMapका उपयोग मानों Booleanको स्वीकार करने के लिए नहीं होता है null) और java.security.PrivilegedAction

मैं एक ने लिखा है वेबलॉग प्रविष्टि पर Voidकुछ साल पहले।


उस सम्मेलन को किसने बनाया? डॉक्स स्थिति docs.oracle.com/javase/tutorial/java/generics/types.html "कन्वेंशन द्वारा टाइप पैरामीटर नामकरण कन्वेंशन, टाइप पैरामीटर नाम एकल, अपरकेस अक्षर हैं।"
बार्लोप

4
@barlop यह तर्क है न कि पैरामीटर नाम। अर्थात यह प्रकार है java.lang.Void। / जोश बलोच ने सम्मेलन को लोकप्रिय बनाया, हालांकि एक बार जब आप इसे देख लेते हैं, तो यह स्पष्ट पसंद होता है।
टॉम हॉकिन - 19:13

2
यह ब्लॉग प्रविष्टि मृत है
mFeinstein

51

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

Constructor<Void> constructor = Void.class.getDeclaredConstructor();
constructor.setAccessible(true);
Void v = constructor.newInstance();
System.out.println("I have a " + v);

कुछ ऐसा प्रिंट करता है

I have a java.lang.Void@75636731

22
+1 उस वर्ग को तत्काल करने के लिए जो प्रलेखन कहता है कि अप्राप्य है। मैंने यह भी किया है और मैं मानता हूं कि इंस्टेंटेड वायड बेकार हैं।
ल्यूक वुडवर्ड

1
कंस्ट्रक्टर <void> cv = Void.class.getDeclaredConstructor (); cv.setAccessible (सही); शून्य v = cv.newInstance (); Println (v); //;)
पीटर लॉरी

एक अभ्यास के रूप में, प्रतिबिंबों का उपयोग करके एक नया वर्ग बनाने का प्रयास करें और देखें कि क्या होता है।
पीटर लॉरी

मुझे एक java.lang.InstantiationException सूरज से मिला। coslect.InstantiationExceptionConstructorAccessorImpl। :(
ल्यूक वुडवर्ड

7
यह विशिष्ट कार्यान्वयन है और किसी भी समय बदल सकता है। इस बात की कोई गारंटी नहीं है कि कक्षा में एक न-अर्ग कंस्ट्रक्टर है और भले ही उसके पास एक ऐसा है जो कुछ भी कर सकता है (शायद System.exit(0))। मैं एक रचनाकार के साथ उपयोगिता कक्षाएं लिखना चाहता हूं private Void() { throw new Error(); }। कुछ नो-वैल्यू एनम पसंद कर सकते हैं।
टॉम हॉल्टिन - 21

27

Future<Void>आकर्षण की तरह काम करता है। :)


6
यह अधिक सामान्य है (उदाहरण के लिए, अमरूद में) का उपयोग करें Future<?>, क्योंकि भविष्य में अक्सर एक वैध मूल्य (गैर- Voidप्रकार का) होगा, लेकिन इसका उपयोग ऐसे संदर्भ में किया जाता है जो मूल्य के बारे में परवाह नहीं करता है।
डेविड फिलिप्स

1
CompletableFuture<Void>एक आकर्षण की तरह काम करता है।
और्रीबक

19

यह देखते हुए कि कोई सार्वजनिक निर्माणकर्ता नहीं हैं , मैं कहूंगा कि इसे इसके अलावा और कुछ नहीं सौंपा जा सकता है null। मैंने केवल इसका उपयोग "मुझे इस सामान्य पैरामीटर का उपयोग करने की आवश्यकता नहीं है" के लिए प्लेसहोल्डर के रूप में किया है, जैसा कि आपका उदाहरण दिखाता है।

इसका उपयोग प्रतिबिंब में भी किया जा सकता है, जो इसके जावदोक कहता है:

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


ओरेकल / सन को देखने के लिए काफी मजेदार है कि यह इस तरह से वर्णन करता है जैसे अशक्त सभी प्रकार का उदाहरण है। किसी भी तरह, जैसा कि आपने कहा, इसका शुद्ध अर्थ है "मैं यहां किसी भी प्रकार लिख सकता हूं क्योंकि मुझे इसमें कोई दिलचस्पी नहीं है, इसलिए मैं यह सुनिश्चित करने के लिए शून्य डाल दूंगा कि मेरे कोड को पढ़ने वाले लोग ठीक से समझें"
स्निकोलस

17

सभी आदिम आवरण वर्गों ( Integer, Byte, Boolean, Double, आदि) एक स्थिर में इसी आदिम वर्ग के लिए एक संदर्भ शामिल TYPEउदाहरण के लिए क्षेत्र,:

Integer.TYPE == int.class
Byte.TYPE == byte.class
Boolean.TYPE == boolean.class
Double.TYPE == double.class

Voidvoidप्रकार के संदर्भ में रखने के लिए शुरू में कहीं बनाया गया था :

Void.TYPE == void.class

हालाँकि, आप उपयोग करके वास्तव में कुछ हासिल नहीं करते हैं Void.TYPE। जब आप इसका उपयोग करते हैं तो void.classयह बहुत स्पष्ट होता है कि आप voidटाइप के साथ कुछ कर रहे हैं ।

एक तरफ के रूप में, पिछली बार जब मैंने इसकी कोशिश की थी , तो बीनशेल ने पहचान नहीं की void.class, इसलिए आपको Void.TYPEवहां उपयोग करना होगा।


8
तो दोनों एक Void.class और एक void.class है!
टॉम एंडरसन

8

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

उदाहरण

public interface LeavesVisitor<OUT>
{
   OUT visit(Leaf1 leaf);

   OUT visit(Leaf2 leaf);
}

जब आप अपने आगंतुक को लागू करेंगे तो आप स्पष्ट रूप से OUT को शून्य के रूप में सेट कर सकते हैं ताकि आप जान सकें कि आपका आगंतुक हमेशा वस्तु की तुलना में अशक्त होगा।

public class MyVoidVisitor implements LeavesVisitor<Void>
{
    Void visit(Leaf1 leaf){
        //...do what you want on your leaf
        return null;
    }

    Void visit(Leaf2 leaf){
        //...do what you want on your leaf
        return null;
    }
}

5

जेनरिक से पहले, यह प्रतिबिंब एपीआई के लिए बनाया गया था, ताकि अन्य आदिम प्रकार की कक्षाओं के अनुरूप शून्य विधि के लिए Method.getReturnType () द्वारा लौटे TYPE को होल्ड किया जा सके।

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


मुझे इस पर विश्वास नहीं है। मेरे सामने अब 1.4 या उससे पहले का JVM नहीं है, लेकिन मेरा मानना ​​है कि Method.getReturnType () हमेशा शून्य विधि के लिए void.class लौटा है।
ल्यूक वुडवर्ड

@Pour: मैं कह रहा हूं कि जेनेरिक से पहले , केवल एक ही उपयोग के बारे में मुझे पता है जो TYPE (जैसे Void.TYPE) को धारण करने के लिए है, जो कि एक शून्य विधि के लिए प्रतिबिंब के Method.getReturnType () में उपयोग किया गया था।
लॉरेंस Dol

यह किसी तरह वापस नहीं आता है Void। कृपया stackoverflow.com/questions/34248693/…
Alireza Fattahi

3

जैसा कि आप शून्य को रोक नहीं सकते हैं, आप अपाचे कॉमन्स नल ऑब्जेक्ट का उपयोग कर सकते हैं , इसलिए

Null aNullObject = ObjectUtils.Null;
Null noObjectHere = null;

पहली पंक्ति में, आपके पास एक ऑब्जेक्ट है, इसलिए aNullObject != nullहोल्ड करता है, जबकि दूसरी लाइन में कोई संदर्भ नहीं है, इसलिए noObjectHere == nullहोल्ड करता है

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

पुनश्च: शून्य ऑब्जेक्ट पैटर्न को ना कहें


1

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

public void onNewRegistration() {
    newRegistrationService.createNewUser(view.getUsername(), view.getPassword(),
            view.getInitialAmount(), view.getCurrency(), new AsyncCallback<Void>() {
      @Override
      public void onFailure(Throwable caught) {

      }

      @Override
      public void onSuccess(Void result) {
        eventBus.fireEvent(new NewRegistrationSuccessEvent());
      }
    });
  } 

यहाँ, जैसा कि आप देख सकते हैं, मैं उस सर्वर से कुछ नहीं चाहता जिसे मैं एक नया पंजीकरण बनाने के लिए कह रहा हूं, लेकिन public interface AsyncCallback<T> { .... }यह एक सामान्य इंटरफ़ेस है, इसलिए मैं शून्य प्रदान करता हूं क्योंकि जेनरिक आदिम प्रकार स्वीकार नहीं करते हैं


0

यह भी आमतौर पर Async-IO पूर्ण कॉलबैक पर प्रयोग किया जाता है जब आप एक Attachmentवस्तु की जरूरत नहीं है । उस स्थिति में आप IO संचालन और कार्यान्वयन के लिए शून्य निर्दिष्ट करते हैं CompletionHandler<Integer,Void>


0

यह दुर्लभ मामला हो सकता है लेकिन एक बार, मैंने Voidपहलू वर्गों में उपयोग किया ।

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

 @AfterReturning(value = "@annotation(log)", 
       returning = "returnValue", 
       argNames = "joinPoint, log, returnValue"
      )
    public void afterReturning(final JoinPoint joinPoint, final Log log,
            final Object returnValue) {

            Class<?> returnType = ((MethodSignature) joinPoint.getSignature())
            .getReturnType();
           if (Void.class.isAssignableFrom (returnType)) ) {
            //Do some log
         }
}
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.