2011-05-31 11 views
11

पर आधारित एक एनम मान सेट करना मेरे पास कई सेटर विधियां हैं जो एक enum लेते हैं। ये आने वाली वस्तुओं की विशेषता पर आधारित हैं। इनमें से एक समूह लिखने के बजाय हार्ड कोड होने के करीब 10 अलग-अलग केस स्टेटमेंट कहते हैं। एक पुन: प्रयोज्य विधि बनाने का कोई तरीका होगा?आने वाली स्ट्रिंग

//Side class declared as 
public final enum Side 

//How I initialise side 
static Side side = Side.SELL;//default 

//method to set object 
Obj.setSide(sideEnum(zasAlloc.getM_buySellCode())); 

//How I am implementing it 
    public static Side sideEnum(String buysell) 
    { 

     if(buysell.equalsIgnoreCase("S")) 
     { 
      side = Side.SELL; //default 
     } 
     else if(buysell.equalsIgnoreCase("B")) 
     { 
      side = Side.BUY; 
     } 

     return side; 

    } 

उत्तर

2

मैं एक साधारण वस्तु मानचित्र का उपयोग समाप्त हो गया:

5

एनम्स में valueOf() विधि है जिसका उपयोग स्ट्रिंग से कनवर्ट करने के लिए किया जा सकता है। क्या आप यही खोज रहे हैं?

+0

ENUM1 का उपयोग कर ("एक", " 1 "," मैं ") getEnum (स्ट्रिंग एस) जैसे मूल्य के समान अपनी विधि बनाएं। यह आपको किसी भी विशेषता मान के लिए ENUM1 वापस करने की अनुमति देगा। मूल्य हालांकि कई मामलों के लिए ठीक काम करता है। – Joseph

+0

टिप्पणी करें कि यह और अधिक दयालु है कि यदि स्ट्रिंग जो अंदर आती है वह "डी" है, तो यह स्थिर एनम पक्ष में है। डीओजी – Will

+0

@Will, यही कारण है कि आपको कुछ कोड प्रदान करने की आवश्यकता है, अन्यथा हम अंधेरे में शूटिंग छोड़ रहे हैं। – mre

24

आप उस कार्यक्षमता को अपने Enum में कार्यान्वित कर सकते हैं।

public enum Side { 

    BUY("B"), SELL("S"), ... 

    private String letter; 
    private Side(String letter) { 
     this.letter = letter; 
    } 

    public static Side fromLetter(String letter) { 
     for (side s : values()){ 
      if (s.letter.equals(letter)) return s; 
     } 
     return null; 
    } 

} 

अगर आपको Side संपादित नहीं कर सकते एक सहायक स्थिर पद्धति के रूप में ऐसा कर सकता है।

public static Side fromString(String from) { 
    for (Side s: Side.values()) { 
     if (s.toString().startsWith(from)) { 
      return s; 
     } 
    } 

    throw new IllegalArgumentException(from); 
} 

उपर्युक्त विधि मानती है कि आपके तार आपके नामों के अनुरूप हैं।

Obj.setSide(Side.valueOf(zasAlloc.getM_buySellCode())); 
+2

मामूली टिप्पणी, यदि आपके पास बहुत सारे enums हैं और 'fromLetter()' विधि को अक्सर कहा जाता है, तो लुकअप/पुनर्प्राप्ति को तेज़ बनाने के लिए स्थिर 'हैश मैप' बनाने का अर्थ हो सकता है। लेकिन आपका समाधान सही समझ में आता है! – Peter

+1

@ पीटर, सही। यह सिर्फ तेज़ और गंदा तरीका है। लेकिन हैशपैप निश्चित रूप से ध्यान देने योग्य है। – jjnguy

0

मैं तुम्हें बराबर की जरूरत है की तरह लगता है

private static HashMap<String, Side> sideMap = new HashMap<String, Side>(7); 
static{ 
    sideMap.put("B", Side.BUY); 
    sideMap.put("S", Side.SELL); 
} 

और बस

Obj.setSide(sideMap.get(zasAlloc.getM_buySellCode())); 
संबंधित मुद्दे