enum.values ​​() - लौटी हुई एनमों का एक क्रम निर्धारक है


105

मेरे पास एक एनम है SOME_ENUM:

public enum SOME_ENUM {
  EN_ONE,
  EN_TWO,
  EN_THREE;
}

क्या SOME_ENUM.values()हमेशा एनम घोषणाओं के क्रम में एनमों को वापस करेगा EN_ONE, EN_TWO, EN_THREE:? क्या यह एक नियम है या अगले JDK रिलीज़ में इसे बदले जाने की गारंटी नहीं है?


1
मैं एक सूची को भरने के लिए अपने एनुम पर पुनरावृत्ति करता हूं, जो कि कोड में अन्य जगह की तुलना में मैंने इस एनम के ऊपर पुनरावृति पढ़ी है।
स्कारैब

11
@ मिचव्हीट इसी कारण से कि आप एक सूची संरक्षण आदेश पर भरोसा करेंगे: क्योंकि JDK एक उपकरण है जो आपको कुछ गारंटी देता है और इन गारंटीओं पर भरोसा करने से आपको अधिक रसीला और बेहतर कोड लिखने में मदद मिलती है। बेशक, यह सवाल "क्या इसे बदलने की गारंटी नहीं है?" जवाब देना असंभव है, आप निश्चित रूप से उस पर भरोसा नहीं कर सकते हैं, कुछ भी गारंटी नहीं है।
फ्लेच

जवाबों:


144

जावा भाषा विनिर्देश इस स्पष्ट भाषा का उपयोग करता है:

@ एनाम प्रकार के स्थिरांक युक्त एक सरणी को क्रम में वे घोषित कर रहे हैं [स्रोत]

तो, हाँ, वे घोषणा के क्रम में वापस आ जाएंगे। यह ध्यान देने योग्य है कि समय के साथ क्रम बदल सकता है यदि कोई वर्ग बदलता है तो बहुत सावधानी बरतें कि आप इसका उपयोग कैसे करते हैं।


1
यदि कोई बाद के कोड संस्करण में बीच में कोई मान जोड़ता है, तो यह आपको नली कर सकता है, क्योंकि यह अन्य तत्वों के क्रमिक मान को बदल देगा (Enum.ordinal () विधि देखें)। यह इस कारण के लिए क्रमिक तंत्र के रूप में क्रमिक स्थिति पर भरोसा करने के लिए सबसे अच्छा नहीं है (यानी, इसे डीबी में स्टोर न करें)।
मैट

1
उस विनिर्देश के लिए स्रोत से लिंक करें?
दान ग्राहन


16

हां, उन्हें उसी क्रम में वापस करने की गारंटी है।

हालाँकि, आपको उस पर और उस ordinal()मूल्य पर भरोसा करने से बचना चाहिए , क्योंकि उदाहरण के लिए, नए आइटम डालने के बाद यह बदल सकता है।


ऋषि सलाह के लिए +1। अध्यादेश के विषय पर (), प्रभावी जावा सुझाव देता है कि सदस्य क्षेत्र को एनम प्रकार से जोड़ना है।
आईडीई

9

यह उस क्रम से निर्धारित होता है जिस क्रम में आपके मान घोषित किए जाते हैं। हालाँकि, इस बात की कोई गारंटी नहीं है कि आप (या कोई और) भविष्य में मानों को फिर से डालने / डालने / हटाने नहीं देंगे । इसलिए आपको आदेश पर भरोसा नहीं करना चाहिए।

प्रभावी जावा 2। संस्करण अपने आइटम 31 को एक निकट से संबंधित विषय को समर्पित करता है: अध्यादेशों के बजाय उदाहरण क्षेत्रों का उपयोग करें :

कभी भी अपने अध्यादेश से किसी एनम से जुड़े मूल्य को प्राप्त न करें; इसके बजाय एक इंस्टेंस फील्ड में स्टोर करें।


3
"कोई गारंटी नहीं है कि कोई भविष्य में मूल्यों को फिर से नहीं करेगा" - लेकिन यही कारण है कि मैं आदेश पर भरोसा करना चाहता हूं :-)! मैं भविष्य में आइटम को फिर से ऑर्डर करने में सक्षम होना चाहता हूं और इस तरह मेरे कार्यक्रम के व्यवहार को बदल सकता हूं। बलोच ऑर्डिनल पर भरोसा नहीं करने के बारे में सही है और यदि पूछने वाले के उदाहरण में वास्तव में EN_TWO जैसे एनम शामिल हैं तो वह ऑर्डिनल पर निर्भर है और ऐसा नहीं करना चाहिए। लेकिन आदेश पर भरोसा करने के लिए पूरी तरह से ठीक है। वास्तव में, जैसा कि आदेश की गारंटी है, विशेष रूप से ऑर्डर के लिए एक फ़ील्ड बनाने के लिए अनावश्यक कोड लिखना होगा, प्रभावी जावा जैसी किताबें आपको बताती हैं कि आप ऐसा नहीं करते हैं।
फ्लेच

@Fletch, क्षमा करें, मैं आपका अनुसरण नहीं करता। मेरे लिए यह ऐसा लगता है जैसे आप enumकिसी ऐसे उद्देश्य के लिए उपयोग करने का प्रयास कर रहे हैं जिसका यह उद्देश्य नहीं था।
पेटर टॉर्क

मान लीजिए कि आपके पास प्रसिद्ध "प्लैनेट" एनम है। अपने UI में आप सूर्य से उनकी दूरी के क्रम में ग्रहों को सूचीबद्ध करना चाहते हैं। आप इसे कैसे सबसे अच्छा कर सकते हैं? मैं ग्रह स्थिरांक को एनम वर्ग के अंदर सही क्रम में रखने का आदेश दूंगा और फिर बस यूम में एनुम की गणना करूंगा। चूंकि आदेश भरोसेमंद है इसलिए यह काम करेगा। इस तरह की बात मैं कर रहा हूं। यदि एक दिन पृथ्वी मंगल की तुलना में सूर्य के करीब जाती है, तो निश्चित रूप से ऐसे क्षण में आपके गर्म दिमाग पर पहली बात आपके कोड को बनाए रखना होगा! इसलिए आप अपने ग्रह वर्ग में जाएं और पृथ्वी को मार्स से पहले ले जाएं।
फ्लेच

@ फ्लेच, पृथ्वी पहले से ही मंगल की तुलना में सूर्य के करीब है;; लेकिन मुझे वही मिलता है जो आपका मतलब है। हालांकि, इस मामले में ग्रहों का क्रम वास्तव में सूर्य से उनकी औसत दूरी का एक कार्य है, जो एक साधारण अध्यादेश नहीं है, इस प्रकार आईएमएचओ को बेहतर रूप से प्रत्येक ग्रह के लिए एक अलग क्षेत्र के रूप में संग्रहीत किया जाना चाहिए। फिर आप एक तुलनित्र तुलनित्र की तुलना कर सकते हैं जो सूर्य से उनकी दूरी के आधार पर ग्रहों की तुलना करते हैं, और इस तुलनित्र का उपयोग करके उन्हें आदेश देते हैं। यह IMHO एक स्वच्छ और मूर्खतापूर्ण समाधान है। जबकि आपका समाधान जल्द से जल्द टूट जाता है जैसे कि एक नए सहयोगी ने फैसला किया कि ग्रहों को स्पष्ट रूप से वर्णानुक्रम में सूचीबद्ध किया जाना चाहिए ;-)
पेरेस Tööök

1
Hahaha ermm हाँ अच्छी तरह से वैसे भी यह सब एक साजिश है, कोई मंगल नहीं है। प्रारंभ में मैं शनि का उपयोग करने जा रहा था, लेकिन यह याद नहीं रख सका कि यह कौन से ग्रहों के पास है, लेकिन लगता है कि मंगल की योजना बैकफायर :-) है। वैसे भी ... इस मामले में एक प्रतियोगी अच्छा होगा, लेकिन अधिक कोड की आवश्यकता के नकारात्मक पहलू है, जाहिर है। मुझे लगता है कि अगर आप सोर्स कोड ऑर्डर करने पर भरोसा कर रहे हैं, तो क्लास कमेंट में यह डॉक्यूमेंट करना अच्छी बात होगी। आपका सहकर्मी भी इसे पढ़ सकता है।
फ्लेच

7

अन्य उत्तर अच्छे हैं, लेकिन इस पर टिप्पणी न करें:

"क्या यह एक नियम है या इसे अगले Jdk रिलीज में नहीं बदले जाने की गारंटी नहीं है?"

मुझे विश्वास नहीं है कि भविष्य JDKs की गारंटी मौजूद है, इसलिए आपको उनके बारे में चिंता भी नहीं करनी चाहिए। उन्हें लागू करने का कोई तरीका नहीं होगा, भविष्य की JDK लीड्स इस तरह की गारंटी पर फिर से निर्णय ले सकती हैं। यह संसद की वेस्टमिंस्टर प्रणाली की तरह है: "कोई भी संसद भविष्य की संसद को बांध नहीं सकती है।"

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

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