2010-09-22 4 views
5

Je suis en train d'écrire une fonction générique qui acceptera tout ENUM, et mettre les valeurs dans une carte pour une utilisation dans un menu déroulant.Paramètre enum générique en Java. Est-ce possible?

C'est ce que j'ai jusqu'à présent, (pour un ENUM spécifique), puis ma fonction enumToMap être réécrite en général d'accepter tout type de 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(); 
     } 


    } 

} 

Merci pour vos suggestions.

Répondre

12

Modifier la signature de votre méthode enumToMap à quelque chose comme ceci:

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

Alors où vous appelez e.values() utilisation enumType.getEnumConstants() à la place.

Dans votre principale méthode vous pouvez appeler cette méthode comme:

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

Comme seanizer mentionne, vous devez également utiliser EnumMap comme la mise en œuvre Map plutôt que HashMap.

+0

Parfait! Merci beaucoup. – Chris

+0

@Chris: S'il vous plaît accepter la réponse avec le chèque si elle répond à votre question. Merci! =) – ColinD

+0

Je ne connaissais pas getEnumConstants() +1 – Wooff

6

Ne pas utiliser un HashMap avec énumérations, c'est ce qu'un EnumMap a été conçu pour.

Comme écrit dans le Map section of the Collection Trail dans le Sun Java Tutorial:

EnumMap, qui est interne mis en œuvre comme un tableau, est un haute performance Map mise en œuvre pour une utilisation avec les touches ENUM. Cette mise en œuvre combine la richesse et la sécurité de l'interface Map avec une vitesse proche de celle d'un tableau. Si vous voulez mapper un ENUM à une valeur, vous devriez toujours utiliser un EnumMap en préférence à un tableau.

Questions connexes