2012-11-11 19 views
17

संभव डुप्लिकेट:
Uses for the Java Void Reference Type?जेडीके में शून्य रैपर वर्ग क्यों मौजूद है?

असली दुनिया की समस्याओं में Void वर्ग के वास्तविक उपयोग क्या है? इस परिदृश्य में हम किस परिदृश्य का उपयोग कर सकते हैं?

उत्तर

14

देख आप एक वस्तु (एक ExecutorService) की तरह है, तो है कि आप एक Callable<T> वस्तु प्रदान करने के लिए की आवश्यकता है, आप इसे एक Callable<Void> पारित दर्शाएं कि आपकी प्रतिदेय कुछ भी वापस नहीं करता है सकते हैं। Callable<T> को किसी प्रकार पर पैरामीटरकृत किया जाना है, इसलिए प्रकार की कमी को इंगित करने के लिए Void प्रदान किया गया है।

12

- अन्य रैपर Void वर्ग के विपरीत अपने आप में नहीं स्टोर प्रकार void के एक मूल्य करता है और इसलिए नहीं सच सार में एक आवरण है।

-Void वर्ग जावाडोक के अनुसार क्योंकि तथ्य यह है कि कुछ समय हम एक वस्तु के रूप में शून्य कीवर्ड प्रतिनिधित्व करने के लिए आवश्यकता हो सकती है के मौजूद है।

- लेकिन एक ही बिंदु पर हम नई operator.This का उपयोग कर शून्य वर्ग का एक उदाहरण नहीं बना सकता है, क्योंकि शून्य में निर्माता निजी के रूप में घोषित किया गया है है। इसके अलावा शून्य वर्ग एक अंतिम कक्षा है जिसका अर्थ है कि इस वर्ग का वारिस करने का कोई तरीका नहीं है।

- तो एकमात्र उद्देश्य है कि Void वर्ग के अस्तित्व के लिए बनी हुई है प्रतिबिंब, जहां हम एक विधि के वापसी प्रकार के रूप में शून्य मिल सकता है।

+0

वहाँ 'सूची ' का कोई व्यावहारिक उपयोग है। –

+0

लेकिन आप एक अव्यावहारिक उपयोग करना चाहते हैं, एक 'सूची ' एक बहुत ही अंतरिक्ष अक्षम काउंटर :-) –

+0

आप ठीक कह रहे हैं, हालांकि के रूप में इस्तेमाल किया जा सकता। जावा में 'शून्य' (गैर) टाइप प्रकार का मतलब सी/सी ++ में 'शून्य' जैसा नहीं है। सूची के प्रकार जहां तत्व प्रकार के बारे में परवाह नहीं है 'सूची ' ... नहीं 'सूची ' है। –

3

जावा प्रतिबिंब एपीआई शून्य। वाईपीई का उपयोग करता है ताकि ल्यूक वुडवर्ड पॉइंट के रूप में शून्य लौटने वाली विधि के रिटर्न प्रकार का प्रतिनिधित्व किया जा सके। (जैसा कि मैंने पहले सोचा था, void.class लौटाएगा java.lang.Void रिटर्न प्रकार घोषित करने के तरीकों के साथ एक अस्पष्टता का कारण बन जाएगा)।

void test(){...}; 

Method handleForTest = ...; 
assert(handleForTest.getReturnType() == Void.TYPE); 

पोस्ट जावा 1.5 शून्य सामान्य कक्षाओं में इस्तेमाल किया जा सकता संकेत मिलता है कि वे कोई मान नहीं है - कार्यान्वयन अभी भी अशक्त वापस जाने के लिए है, लेकिन जब से उस प्रकार के लिए ही मान्य मूल्य है इसे अनदेखा किया जा सकता है शून्य।

interface<T> Example{ 
     //Implementations may do something and return a result 
     T doSomeThing(); 
} 

class ExampleVoid implements Example<Void>{ 
     //does something without returning a result 
     Void doSomething(){return null;} 
} 

इसके अलावा जावा बस पता चलता है, तो मूल वापसी प्रकार वस्तु है कि यह जेनरिक बिना काम करता है, जब एक विधि को अधिलेखित, इस मूल रूप से ऊपर सामान्य उदाहरण के रूप में एक ही है एक अधिक विशिष्ट वापसी प्रकार देने के लिए अनुमति देता है।

interface Example{ 
     //Implementations may do something and return a result 
     Object doSomeThing(); 
} 

class ExampleVoid implements Example{ 
     //does something without returning a result 
     Void doSomething(){return null;} 
} 
+0

जावा प्रतिबिंब एपीआई 'void' तरीकों की वापसी प्रकार, नहीं' Void.class' के रूप में 'void.class' उपयोग करता है। आपके पहले उदाहरण में, दावा विफल हो जाएगा। –

+0

@LukeWoodward धन्यवाद, मैंने अपना जवाब अपडेट किया – josefx

2

JLS#14.8. Expression Statements

सी के विपरीत और (यह बाद से शून्य हर दूसरे जावा प्रकार के रूप में एक ही नियमों का पालन करती वस्तु तक ही सीमित है, दुर्भाग्य से इसके लिए बेनाम अशक्त-प्रकार का उपयोग करने के कोई रास्ता नहीं है) सी ++, जावा प्रोग्रामिंग भाषा अभिव्यक्ति कथन के रूप में अभिव्यक्तियों के केवल कुछ रूपों का उपयोग करने की अनुमति देती है।

(void)... ; // incorrect! 

नहीं करता है: ध्यान दें कि जावा प्रोग्रामिंग भाषा एक "डाली शून्य करने के लिए" की अनुमति नहीं है - तो जैसे एक अभिव्यक्ति बयान लिखने की पारंपरिक सी चाल - शून्य एक प्रकार नहीं है काम। दूसरी तरफ, जावा प्रोग्रामिंग भाषा अभिव्यक्ति बयानों में सभी सबसे उपयोगी प्रकार के अभिव्यक्तियों की अनुमति देती है, और इसे एक विधि विधि का आह्वान करने के लिए अभिव्यक्ति कथन के रूप में उपयोग किए जाने वाले विधि आमंत्रण की आवश्यकता नहीं होती है, इसलिए ऐसी चाल लगभग कभी भी आवश्यक नहीं होती है। यदि एक चाल की आवश्यकता है, तो इसके बजाय एक असाइनमेंट स्टेटमेंट (§15.26) या स्थानीय परिवर्तनीय घोषणा कथन (§14.4) का उपयोग किया जा सकता है।

JLS#15.8.2. Class Literals

void.class के प्रकार (§8.4.5) Class<Void> है।

JLS#8.4.5. Method Return Type

एक विधि घोषणा का परिणाम या तो मूल्य के प्रकार है कि विधि रिटर्न (वापसी प्रकार), या कीवर्ड शून्य का उपयोग करता है संकेत मिलता है कि विधि एक मूल्य वापस नहीं करता है वाणी ।

Java doc Void

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

यह प्रतिबिंब उद्देश्य के लिए प्रयोग किया जाता है जब आप एक विधि

if (getClass().getMethod("someMethod").getReturnType() == Void.TYPE) 

ही की वापसी प्रकार की जांच करना चाहते रहे हैं जेनेरिक तरीकों के साथ लागू है।

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

कारण

Void प्रकार कॉल-पीठ और बाहरी सिस्टम (JNI, जावास्क्रिप्ट, आदि एप्लेट से कॉल ...) के साथ इंटरफेस के लिए अनुमति देने के लिए पेश किया गया था, और के दिनों से ही चारों ओर से किया गया है जावा 1.1 ऐसे मामलों के लिए जहां इंटरफ़ेस प्रकार अन्य इंटरफ़ेस द्वारा ज्ञात या लागू नहीं किया जाता है (और इस प्रकार आप void keyword का उपयोग नहीं कर सकते हैं)। जावा को डिज़ाइन किया गया है - प्राइमेटिव्स और नल रेफरेंस को छोड़कर - "सब कुछ एक वस्तु है" भाषा के रूप में, अपेक्षित प्रकारों की अनुपस्थिति को इंगित करने के लिए एक डमी रैपर/प्लेसहोल्डर की आवश्यकता होती है।

परिभाषा

एक विधि, के रूप में JLS (§8.4.5) की method return type अनुभाग द्वारा परिभाषित की जरूरत औपचारिक रूप से वापसी प्रकार में घोषित करने के लिए है:

एक विधि घोषणा या तो का परिणाम प्रकार वाणी मूल्य कि विधि रिटर्न (वापसी प्रकार), या कीवर्ड का उपयोग करता है के void लिए संकेत मिलता है कि विधि एक मूल्य वापस नहीं करता है।

Class Literals के लिए JLS अनुभाग में उल्लेख किया है (§15.8.2):

void.class (§8.4.5) के प्रकार Class<Void>

सामान्य उपयोग है

इसका उपयोग अधिक प्रमुख बन गया जावा 5 में जेनेरिक की शुरुआत के साथ, क्योंकि इनकी परिभाषा की अनुमति है जेनेरिक का उपयोग करने के लिए इंटरफेस और इन इंटरफेस और कॉलबैक के उपयोग को टाइप-चेक करने की अनुमति देगा। इससे पहले, यह कभी कभी implementer पता करने के लिए AccessController, बहुत बार एप्लेट में प्रयोग किया जाता का उपयोग कर सुरक्षित कोड पथ को परिभाषित करने के लिए एक priviledged निष्पादन ब्लॉक के मामले में कोई पारित कर दिया वस्तु या कोई वापसी वस्तु, उदाहरण के लिए वहाँ था अप करने के लिए हो गया होता:

somemethod() { 
    // ...normal code here... 
    AccessController.doPrivileged(new PrivilegedAction<Void>() { 
     public Void run() { 
      // privileged code goes here, for example: 
      System.loadLibrary("awt"); 
      return null; // nothing to return 
     } 
    }); 
    // ...normal code here... 
} 

नोट जावा 1.4 version of this same code, जहां यह फोन करने वाले कि कुछ भी नहीं दिया जाता है के लिए स्पष्ट (और प्रकार-सुरक्षित) नहीं था के साथ अंतर:

somemethod() { 
     // ...normal code here... 
     AccessController.doPrivileged(new PrivilegedAction() { 
      public Object run() { 
       // privileged code goes here, for example: 
       System.loadLibrary("awt"); 
       return null; // nothing to return 
      } 
     }); 
     // ...normal code here... 
    } 

इसके अलावा पढ़ना और इसी तरह के सवाल

संबंधित मुद्दे