2010-09-22 23 views
5

मैं एक सामान्य कार्य लिखने की कोशिश कर रहा हूं जो किसी भी enum को स्वीकार करेगा, और मूल्यों को एक ड्रॉप डाउन में उपयोग के लिए मानचित्र में डाल देगा।जावा में जेनेरिक एनम पैरामीटर। क्या यह संभव है?

यह मेरे पास अब तक है, (एक विशिष्ट enum के लिए), क्या मेरे फ़ंक्शन enumToMap को आम तौर पर किसी भी enum प्रकार को स्वीकार करने के लिए लिखा जा सकता है?

import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.HashMap; 
import java.util.List; 
import java.util.Map; 

public class Main { 

    private enum testenum{ 
     RED,BLUE,GREEN 
    } 


    private static Map enumToMap(testenum e){ 
     HashMap result = new HashMap(); 
     List<testenum> orderReceiptKeys = Arrays.asList(e.values()); 
     List<String> orderReceiptValues = unCapsCase(orderReceiptKeys); 
     for(int i=0;i<orderReceiptKeys.size();i++){ 
      result.put(orderReceiptKeys.get(i), orderReceiptValues.get(i)); 
     } 
     return result; 
    } 

    /** 
    * Converts a string in the form of 'TEST_CASE' to 'Test case' 
    * @param s 
    * @return 
    */ 
    private static String unCapsCase(String s){ 
     StringBuilder builder = new StringBuilder(); 
     boolean first=true; 
     for(char c:s.toCharArray()){ 
      if(!first) 
       c=Character.toLowerCase(c); 
      if(c=='_') 
       c=' '; 
      builder.append(c); 
      first=false; 
     } 
     return builder.toString(); 
    } 


    /** 
    * Converts a list of strings in the form of 'TEST_CASE' to 'Test case' 
    * @param l 
    * @return 
    */ 
    private static List<String> unCapsCase(List l){ 
     List<String> list = new ArrayList(); 

     for(Object o:l){ 
      list.add(unCapsCase(o.toString())); 
     } 

     return list; 
    } 


    public static void main(String[] args) throws Exception { 

     try{ 
      testenum e=testenum.BLUE; 
      Map map = enumToMap(e); 
      for(Object k:map.keySet()){ 
       System.out.println(k.toString()+"=>"+map.get(k)); 
      } 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 


    } 

} 

किसी भी सुझाव के लिए धन्यवाद।

उत्तर

12

बदलें कुछ इस तरह करने के लिए अपने enumToMap विधि के हस्ताक्षर:

private static <E extends Enum<E>> Map<E, String> enumToMap(Class<E> enumType) 

फिर जहां e.values() उपयोग enumType.getEnumConstants() बजाय कहते हैं।

Map<testenum, String> map = enumToMap(testenum.class); 

seanizer का उल्लेख किया है, आप भी बजाय Map कार्यान्वयन HashMap रूप EnumMap का उपयोग करना चाहिए:

आपका मुख्य विधि में आप तो जैसे इस विधि कॉल कर सकते हैं।

+0

बिल्कुल सही! बहुत बहुत धन्यवाद। – Chris

+0

@Chris: अगर यह आपके प्रश्न का उत्तर देता है तो कृपया चेक के साथ जवाब स्वीकार करें। धन्यवाद! =) – ColinD

+0

मुझे getEnumConstants() +1 नहीं पता था – Wooff

6

enums के साथ हैश मैप का उपयोग न करें, यह EnumMap के लिए डिज़ाइन किया गया था।

सन जावा ट्यूटोरियल में Map section of the Collection Trail में लिखा है:

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

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