2010-09-22 24 views
5

Sto provando a scrivere una funzione generica che accetterà qualsiasi enumerazione e inserirò i valori in una mappa da utilizzare in un menu a discesa.Parametro enum generico in java. È possibile?

Questo è quello che ho finora, (per uno specifico enum), la mia funzione enumToMap può essere riscritta in generale per accettare qualsiasi tipo di 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(); 
     } 


    } 

} 

Grazie per eventuali suggerimenti.

risposta

12

modificare la firma del metodo enumToMap a qualcosa di simile:

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

Allora dove si chiama e.values() uso enumType.getEnumConstants() invece.

nel metodo principale è quindi possibile chiamare questo metodo come:

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

Come seanizer cita, si dovrebbe anche utilizzare EnumMap l'attuazione Map piuttosto che HashMap.

+0

Perfetto! Grazie mille. – Chris

+0

@Chris: Si prega di accettare la risposta con il controllo se risponde alla tua domanda. Grazie! =) – ColinD

+0

Non sapevo getEnumConstants() +1 – Wooff

6

Non utilizzare una HashMap con enumerazione, questo è stato progettato per lo EnumMap.

Come scritto nel Map section of the Collection Trail in Java Tutorial sole:

EnumMap, che è internamente implementato come una matrice, è un ad alte prestazioni Map implementazione per l'uso con le chiavi enum. Questa implementazione combina la ricchezza e la sicurezza dell'interfaccia Map con una velocità che si avvicina a quella di un array. Se si desidera mappare un enum ad un valore, si dovrebbe sempre usare un EnumMap in preferenza per un array.

Problemi correlati