2013-01-04 13 views
14

मैं एक इकाई एक enum संपत्ति है कि है। समस्या यह है कि मैं डेटाबेस में int मान को सहेजता हूं और मुझे int मान मिलता है! मैं नीचे जैसे स्विच का उपयोग नहीं कर सकता:enum का उपयोग कर/मामले

MyFile file = new MyFile(); 
int downloadStatus = ... 
switch(downloadStatus) { 
    case NOT_DOWNLOADED: 
    file.setDownloadStatus(NOT_DOWNLOADED); 
    break; 
    // ... 
}  

मुझे क्या करना चाहिए?

+0

सबसे खराब मामला हो सकता है, लेकिन केवल समाधान जो मैं कर सकता हूं वह वर्ग को विस्तारित करने के माध्यम से एक अलग गेटर का उपयोग करता है जो enum के रूप में मूल्य लौटाता है। –

उत्तर

26

आप प्रदान कर सकता है अपने enum में एक स्थिर विधि:

public static DownloadStatus getStatusFromInt(int status) { 
    //here return the appropriate enum constant 
} 
फिर अपने मुख्य कोड में

:

01 ,

public enum DownloadStatus { 
    NOT_DOWNLOADED(1), 
    DOWNLOAD_IN_PROGRESS(2), 
    DOWNLOADED(4);   /// Ooops, database changed, it is not 3 any more 
} 

ध्यान दें कि getStatusFromInt की प्रारंभिक कार्यान्वयन क्रमसूचक संपत्ति का उपयोग कर सकते:

int downloadStatus = ...; 
DowloadStatus status = DowloadStatus.getStatusFromInt(downloadStatus); 
switch (status) { 
    case DowloadStatus.NOT_DOWNLOADED: 
     //etc. 
} 

बनाम क्रमसूचक दृष्टिकोण इस का लाभ यह है कि यह अभी भी कुछ ऐसा होगा कि आपके enum परिवर्तन काम करेगा लेकिन यह कार्यान्वयन विस्तार अब enum वर्ग में संलग्न है।

11

प्रत्येक जावा एनम में एक ऑर्डिनल होता है जो स्वचालित रूप से असाइन किया जाता है, इसलिए आपको int को मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता नहीं है (लेकिन ध्यान रखें कि ordinals 0 से शुरू होते हैं, न कि 1)।

फिर, क्रमसूचक से अपने enum प्राप्त करने के लिए, आप कर सकते हैं:

int downloadStatus = ... 
DownloadStatus ds = DownloadStatus.values()[downloadStatus]; 

... तो आप enum का उपयोग कर अपने स्विच कर सकते हैं ...

switch (ds) 
{ 
    case NOT_DOWNLOADED: 
    ... 
} 
+0

"..., इसलिए आपको int को मैन्युअल रूप से निर्दिष्ट करने की आवश्यकता नहीं है ..." <--- यह सच नहीं है जब आपको अन्य (तृतीय पक्ष) सॉफ़्टवेयर या मशीनों के साथ संवाद करने की आवश्यकता होती है, जिनके लिए निश्चित निश्चितांक होते हैं इंटरफ़ेस (उदाहरण के लिए संदेश प्रकार)! – user504342

+0

@ user504342: इस उत्तर का बिंदु यह है कि एक enum में पहले से ही एक ordinal है, और इसलिए यदि आपका उपयोग केस आपको उस पर भरोसा करने की अनुमति देता है, तो आप कुछ और करने की आवश्यकता के बिना कर सकते हैं। यदि आप ordinal का उपयोग नहीं कर सकते हैं क्योंकि आपको कुछ मौजूदा योजनाओं का पालन करना है, तो [assylias 'answer] (http://stackoverflow.com/a/14154869/1212960) इसमें शामिल है। –

+0

\ @GregKopff: असहमत होने के लिए खेद है। जोशुआ ब्लोच पुस्तक प्रभावशाली जावा (द्वितीय संस्करण) के अनुसार आपको सामान्य मूल्यों पर भरोसा नहीं करना चाहिए। आइटम 31 देखें जो स्पष्ट रूप से कहता है: "कभी भी अपने ordinal से enum से जुड़े मान को प्राप्त न करें; इसे इसके बजाय एक उदाहरण फ़ील्ड में स्टोर करें"। किताब विस्तार से बताती है कि ऐसा क्यों है। – user504342

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