2012-03-08 5 views
6

जावा राज्यों प्रारंभिक मूल्य की क्रमसूचक कि जब मैं इस तरह की एक गणन बनाने 0. मैं मान सकते हैं यह है कि:क्या मुझे लगता है कि जावा गणना 1 से स्वतः वृद्धि हुई है?

public enum Direction {MONDAY, TUESDAY, WEDNESDAY, THURSDAY, ...} 

TUESDAY की क्रमसूचक हमेशा होता है कि 1, कि WEDNESDAY हमेशा 2 की, .. ।?


मैं थोड़ा और विशिष्ट होगा। मैं एक गणना घोषित कर रहा हूं:

public enum Direction {UP,RIGHT,DOWN,LEFT} 

अब 90 डिग्री (घड़ी की दिशा) बारी करने के लिए एक विधि है।

switch (direction) { 
    case LEFT:newdirection = Direction.UP; 
    break; 
    etc... 
} 

ऑर्डिनल्स उपयोग करने के लिए एक जोड़े को लाभ कर रहे हैं:

    direction = Direction.values()[direction.ordinal()+1 % Direction.values().length]; 
    

    मैं ऑर्डिनल्स का उपयोग नहीं करेंगे, तो मैं स्विच बयान या शर्तों का उपयोग करना होगा: यह ऑर्डिनल्स साथ एक पंक्ति है

  • कम कोड
  • तेज कोड (नगण्य)
  • यदि कोई दिशा है (उदाहरण के DOWN_LEFT के लिए) जोड़ा जाता है कार्यान्वयन जरूरी है अगर आप सही जगह

पर नई दिशा डाल आपको क्या लगता है बदलने की जरूरत नहीं है?

+2

यदि यह महत्वपूर्ण है (उदा। कस्टम सीरियलाइजेशन के लिए), तो आप किसी भी स्पष्ट मैपिंग के साथ बेहतर होंगे। बस 'एनमैप <दिशा, इंटीजर>' बनाएं या 'दिशा' एक 'int' फ़ील्ड दें। –

+0

मैं इसे साफ रखूंगा। यह स्कूल के लिए है, लेकिन तकनीकी रूप से हमने अभी तक गणनाओं का उपयोग नहीं किया है, और EnumMap शायद थोड़ा चरम होगा क्योंकि हमने अभी तक सरणी के बारे में भी नहीं सीखा है: डी। – Fatso

+0

स्वच्छ की आपकी धारणा थोड़ा गुमराह है :-)। Ordinal पर निर्भर इस कोड को एक बेहद गन्दा तरीका होगा। –

उत्तर

7

हाँ - javadoc देखें:

इस गणना स्थायी की क्रमसूचक (अपने enum घोषणा, जहां प्रारंभिक लगातार शून्य का एक क्रमसूचक असाइन किया गया है में अपनी स्थिति) देता है।

+0

मुझे समझ नहीं आता: यह केवल राज्यों प्रारंभिक निरंतर की क्रमसूचक शून्य है, नहीं दूसरी निरंतर क्रमसूचक 1, या है कि तीसरे निरंतर क्रमसूचक 2, ... – Fatso

+0

@Korion "अपने अपने enum घोषणा में स्थिति यह है कि ", 0 से शुरू हो रहा है। तो MONDAY.ordinal() == 0, TUESDAY.ordinal() == 1 आदि – assylias

+0

ठीक है, मेरी गलती। आपका बहुत बहुत धन्यवाद! – Fatso

2

हां। हालांकि, उस पर भरोसा करना सबसे अच्छा विचार नहीं है यदि आप कभी भी अलग-अलग स्थानों में नए enums को पुन: व्यवस्थित करना या जोड़ना चाहते हैं, या यदि आपको मौजूदा मान बदलने का कोई कारण मिलता है। मुझे उनके सामान्य मूल्य और नाम से अलग वास्तविक मूल्य/अर्थ देने के लिए बेहतर लगता है।

+0

ठीक है, उत्तर के लिए धन्यवाद। चूंकि मैं ऊपर की तरह एक मानक enum का उपयोग कर रहा हूं जो इसकी सामग्री को कभी नहीं बदलेगा, मुझे लगता है कि मैं धारणा कर दूंगा। – Fatso

7

हां - लेकिन आपका कोड उस पर भरोसा नहीं करना चाहिए क्योंकि जब कोई कैटवेन डालता है तो यह टूट जाएगा।

+0

सच है, लेकिन मेरे मामले में गणना हमेशा एक ही रहेगी। – Fatso

+5

@ कोरियन: प्रसिद्ध अंतिम शब्द ... –

+0

आप सही हैं: डी। मेरी गणना वास्तव में {यूपी, दाएं, नीचे, बाएं} है, लेकिन मुझे लगता है कि तकनीकी रूप से शिक्षक मुझे बग कर सकता है और DOWN_LEFT, UP_RIGHT जैसे दिशाएं जोड़ सकता है ... – Fatso

3

आप भी इस तरह अनुक्रमित लागू कर सकते हैं:

enum Direction { 
    MONDAY(1), 
    TUESDAY(2); 
    // etc... 

    private int value;  

    private Direction(int value) { 
    this.value = value; 
    } 

    public int getValue() { 
    return value; 
    } 
} 
4

हाँ, हालांकि, इस पर निर्भर अपने कोड भंगुर बनाता है। यदि आप कभी भी enum में स्थिरांक का क्रम बदलते हैं या उनके बीच स्थिरांक जोड़ते हैं, तो कुछ स्थिरांक के ordinals बदल जाएगा। तो, उदाहरण के लिए यह किसी डेटाबेस या फ़ाइल में क्रमिक संख्याओं को संग्रहीत करने का अच्छा विचार नहीं है, क्योंकि यदि आपका स्रोत कोड बदलता है, तो डेटाबेस या फ़ाइल में डेटा आपके बदले गए कोड के साथ अब संगत नहीं होगा।

एक और मजबूत समाधान स्पष्ट रूप से आपके प्रत्येक स्थिरांक के साथ कोड स्टोर करना है। उदाहरण के लिए:

public enum Status { 
    NEW(0), 
    PROCESSING(1), 
    OK(2), 
    ERROR(99); 

    private final int code; 

    private Status(int code) { 
     this.code = code; 
    } 

    // Get the code for an enum constant 
    public int getCode() { 
     return code; 
    } 

    // Given a code, get the corresponding enum constant 
    public static Status fromCode(int code) { 
     for (Status s : Status.values()) { 
      if (s.code == code) { 
       return s; 
      } 
     } 

     throw new IllegalArgumentException("Invalid code: " + code); 
    } 
} 
1

ऑर्डिनल्स के साथ समस्या यह है कि वे enum मूल्यों की घोषणा के क्रम पर निर्भर है।यदि किसी बिंदु पर गणना में एक नया मान जोड़ा जाता है, और यह दूसरों के बीच में जोड़ा जाता है, तो ordals बदल जाएगा, एक विशिष्ट ordinal मूल्य पर निर्भर सभी कोड अवैध।

आप पूरी तरह एक क्रमसूचक मूल्य के लिए एक निश्चित संख्या आवंटित करना आवश्यक है, इस काम का हो सकता:

enum Directions { 
    NORTH(1), 
    SOUTH(2), 
    WEST(3), 
    EAST(4); 
    private int code; 
    Directions(int code) { 
     this.code = code; 
    } 
    public int getCode() { 
     return code; 
    } 
} 

ऊपर स्निपेट में, एक code विशेषता प्रत्येक गणना मूल्य के लिए जुड़ा हुआ है, और आप यकीन है कि हो सकता है कि यह हमेशा एक ही मूल्य होगा - एक निर्माता में पारित किया।

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