एनम के मूल्यों () पद्धति के लिए दस्तावेज कहां है?


172

मैं एक एनम की घोषणा करता हूं:

enum Sex {MALE,FEMALE};

और फिर, जैसा कि नीचे दिखाया गया है, iterate enum:

for(Sex v : Sex.values()){
    System.out.println(" values :"+ v);
}

मैंने जावा एपीआई की जाँच की, लेकिन मान () विधि नहीं पा सकता है? मैं उत्सुक हूं कि यह तरीका कहां से आता है?

एपीआई लिंक: https://docs.oracle.com/javase/8/docs/api/java/lang/Enn.html

जवाबों:


178

आप इस विधि को javadoc में नहीं देख सकते क्योंकि यह संकलक द्वारा जोड़ा गया है।

तीन स्थानों पर प्रलेखित:

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

  • Enum.valueOfवर्ग
    (विशेष निहित valuesविधि विधि के वर्णन में वर्णित है valueOf)

एक enum प्रकार के सभी स्थिरांक उस प्रकार के निहित सार्वजनिक स्थैतिक T [] मान () विधि को कॉल करके प्राप्त किए जा सकते हैं।

valuesसमारोह बस गणन के सभी मानों की सूची।


6
इसका कोई खास कारण? यह एपीआई का हिस्सा क्यों नहीं है?
राय.कुमार

10
क्योंकि सिर्फ मानक तंत्र (enum के बिना) का उपयोग करके, आपके पास यह स्थिर विधि नहीं हो सकती है। जावा विनिर्देश को उन एनमों को अनुमति देने के लिए बढ़ाया जाना था, इसीलिए इसे कंपाइलर द्वारा जोड़ा जाना चाहिए।
डेसिग सेटरेट

4
जावा 7 के बाद से यह java.lang.Enum के javadoc में जोड़ा गया है, स्थिर वैल्यूऑफ विधि के विवरण में।
कैटवेज़ल

3
क्या "मान" () को कॉल करने से एक नई सरणी बनती है, या क्या यह उसी का पुन: उपयोग करता है?
एंड्रॉयड डेवलपर

3
@androiddeveloper यह एक नया एरे देता है (अन्यथा आप
एनम के

35

विधि स्पष्ट रूप से परिभाषित है (यानी संकलक द्वारा उत्पन्न)।

से JLS :

इसके अलावा, यदि Eकिसी enumप्रकार का नाम है , तो उस प्रकार के निम्नलिखित स्पष्ट staticतरीके हैं:

/**
* Returns an array containing the constants of this enum 
* type, in the order they're declared.  This method may be
* used to iterate over the constants as follows:
*
*    for(E c : E.values())
*        System.out.println(c);
*
* @return an array containing the constants of this enum 
* type, in the order they're declared
*/
public static E[] values();

/**
* Returns the enum constant of this type with the specified
* name.
* The string must match exactly an identifier used to declare
* an enum constant in this type.  (Extraneous whitespace 
* characters are not permitted.)
* 
* @return the enum constant with the specified name
* @throws IllegalArgumentException if this enum type has no
* constant with the specified name
*/
public static E valueOf(String name);

Added by the compilerइसका मतलब है कि इस कोड के लिए कोई .java या कोड संकलक द्वारा उत्पन्न नहीं किया गया है? मैं जाँच की Enum की OpenJDK स्रोत कोड और वहाँ कोई हैvalues()
मार्को सुल्ला

12

इसे चलाओ

    for (Method m : sex.class.getDeclaredMethods()) {
        System.out.println(m);
    }

तुम देखोगे

public static test.Sex test.Sex.valueOf(java.lang.String)
public static test.Sex[] test.Sex.values()

ये सभी सार्वजनिक तरीके हैं जो "सेक्स" वर्ग के पास हैं। वे स्रोत कोड में नहीं हैं, javac.exe ने उन्हें जोड़ा

टिप्पणियाँ:

  1. कभी भी क्लास के नाम के रूप में सेक्स का उपयोग न करें, आपके कोड को पढ़ना मुश्किल है, हम जावा में सेक्स का उपयोग करते हैं

  2. जब इस तरह की एक जावा पहेली का सामना करना पड़ रहा है, तो मैं एक बाईटेकोड डिकम्पॉइलर टूल का उपयोग करने की सलाह देता हूं (मैं एंड्री लॉसकुटोव के बायटेकोड की रूपरेखा Eclispe प्लगइन का उपयोग करता हूं)। यह सब दिखाएगा कि एक कक्षा के अंदर क्या है

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