2013-03-16 7 views
1

Je dois rechercher dans un enum par un int. Le ENUM est aussi folows:Recherche dans les constantes d'énumération par des données spécifiques constantes

public enum ErrorCode{ 

    MissingReturn(1,"Some long String here"), 
    InvalidArgument(2,"Another long String here"); 


    private final int shortCode ; 

    private final String detailMessage; 

    ErrorCode(shortCode ,detailMessage){ 
     this.shortCode = shortCode ; 
     this.detailMessage= detailMessage; 
    } 

    public String getDetailedMessage(){ 
     return this.detailMessage; 
    }  

    public int getShortCode(){ 
     return this.shortCode ; 
    }  

    } 

est maintenant nécessaire d'avoir une méthode de recherche qui prendrait un intle code et doit me renvoyer le message String se rapportant à ce code qui est stocké dans le Enum .Passing un "1" devrait me renvoyer la chaîne "Une longue chaîne ici". Quelle est la meilleure façon d'implémenter cette fonctionnalité?

public static String lookUpMessageFromCode(int code){ 


} 

P.S: La classe EnumMap utile pour ce genre de cas d'utilisation? Si oui, s'il vous plaît laissez-moi savoir pourquoi?

+0

Je l'ai vu demandé (et répondu) à plusieurs reprises dans les deux dernières jours. – NPE

+0

@NPE Des pointeurs? – Geek

+0

Les valeurs de shortCode sont-elles arbitraires (pas de modèle particulier), ou sont-elles seulement 1, 2, 3, etc? – Bohemian

Répondre

1

Selon les int valeurs que vous associé à votre enum, je voudrais ajouter un tableau statique de ErrorCode s, ou un Map<Integer,ErrorCode> statique à votre classe enum, et l'utiliser pour faire une recherche dans le message de méthode de code. Dans votre cas, un tableau est plus approprié, car vous avez des valeurs 1 et 2 qui sont petites. Je voudrais également changer la signature pour retourner ErrorCode.

private static final ErrorCode[] allErrorCodes = new ErrorCode[] { 
    null, MissingReturn, InvalidArgument 
}; 

public static ErrorCode lookUpByCode(int code) { 
    // Add range checking to see if the code is valid 
    return allErrorCodes[code]; 
} 

Les appelants qui ont besoin du message obtiendrait comme ceci:

String message = ErrorCode.lookUpByCode(myErrorCode).getDetailedMessage(); 
+0

Ne pouvons-nous pas utiliser EnumMap? Veuillez voir la dernière ligne. – Geek

+1

@Geek Non, parce que 'EnumMap' est pour mapper * depuis * un' enum', alors que votre tâche appelle un mapping d'un entier * vers * un 'enum'. – dasblinkenlight

+0

merci pour la clarification. – Geek

0

Je voudrais simplement itérer vos valeurs Enum et vérifier le code. Cette solution vous permet d'utiliser le Enum sans créer un autre objet à gérer.

public enum ErrorCode { 

    MissingReturn(1, "Some long String here"), 
    InvalidArgument(2, "Another long String here"); 

    private final int shortCode; 

    private final String detailMessage; 

    ErrorCode(int shortCode, String detailMessage) { 
     this.shortCode = shortCode; 
     this.detailMessage = detailMessage; 
    } 

    public String getDetailedMessage() { 
     return this.detailMessage; 
    } 

    public int getShortCode() { 
     return this.shortCode; 
    } 

    public static String lookUpMessageFromCode(int code) { 
     String message = null; 
     for (ErrorCode errorCode : ErrorCode.values()) { 
      if (errorCode.getShortCode() == code) { 
       message = errorCode.getDetailedMessage(); 
       break; 
      } 
     } 
     return message; 
    } 

    public static void main(String[] args) { 
     System.out.println(ErrorCode.lookUpMessageFromCode(1)); 
     System.out.println(ErrorCode.lookUpMessageFromCode(2)); 
    } 

} 

Une chose à noter

Le constructeur Enum manque les informations de type concernant ses paramètres.

ErrorCode(int shortCode, String detailMessage) { 
    this.shortCode = shortCode; 
    this.detailMessage = detailMessage; 
} 
+0

votre programme ne serait pas bien à l'échelle s'il y a beaucoup de constantes dans l'énumération. La réponse de dasblinkenlight ferait bien à cet égard puisque la recherche se fera en O (1) fois. – Geek

0

Voici une autre option:

 public static String lookUpMessageFromCode(int code){ 
    for(ErrorCode ec:ErrorCode.values()){ 
     if(ec.shortCode==code) 
      return ec.detailMessage; 
    } 
    return null; 
}