IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage Java Discussion :

Retrouver un énuméré "identifié"


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Par défaut Retrouver un énuméré "identifié"
    Bonjour,

    Quand on a une enumération "identifiée", comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    public enum OperatorType {
    	/**
             * ( operator
             */
    	OPEN(0),
    	/**
             * ) operator
             */
    	CLOSE(1),
    	/**
             * Multiplication operator.
             */
    	MULTIPLICATION(2),
     
    ...
    Ya t-il un moyen pour récupérer un élement de l'énum à partir de l'identifiant, sans écrire un gros switch/case:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    	public final static OperatorType fromId(int id) {
    		switch (id) {
    		case 0:
    			return OPEN;
    		case 1:
    			return CLOSE;
    		case 2:
    			return MULTIPLICATION;
    Car dans mon cas, j'ai énormément d'éléments et écrire le switch/case est facilement sujet à bogues !

    Merci !

    Toine

  2. #2
    Membre chevronné Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Par défaut
    Pourquoi ne fais tu pas une map static ?

  3. #3
    Membre éclairé

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Par défaut
    dans l'énum ?

  4. #4
    Membre chevronné Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Par défaut
    Non tu remplace ton enum par une map static. Ca te permettra d'avoir tes couples (clé/valeur).

  5. #5
    Membre éclairé

    Inscrit en
    Mai 2002
    Messages
    328
    Détails du profil
    Informations personnelles :
    Âge : 45

    Informations forums :
    Inscription : Mai 2002
    Messages : 328
    Par défaut
    j'ai vraiment besoin de l'énum...

    voilà une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    	public static void main(String[] args) {
    		OperatorType[] all = OperatorType.values();
    		System.out.println("switch (id) {");
    		for (OperatorType idType : all) {
    			System.out.println("case " + idType.value + ":");
    			System.out.println("return " + idType.name() + ";");
    		}
    		System.out.println("} return null;");
    	}

  6. #6
    Membre chevronné Avatar de JoloKossovar
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    532
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 532
    Par défaut
    La méthode d'adiguba est la bonne alors ^^
    D'ailleurs je ne connaissais pas ordinal().

  7. #7
    Expert éminent
    Avatar de adiGuba
    Homme Profil pro
    Développeur Java/Web
    Inscrit en
    Avril 2002
    Messages
    13 938
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Java/Web
    Secteur : Transports

    Informations forums :
    Inscription : Avril 2002
    Messages : 13 938
    Billets dans le blog
    1
    Par défaut
    Salut,



    Deux solutions : si tu n'as pas besoin d'ID spécifique autant utiliser l'ordre des enums : chaque éléments d'une enum est associé à une valeur entière accessible via la méthode ordinal(), et correspondant à son index dans la déclaration des éléments de l'enum.

    Ainsi avec ce code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public enum OperatorType {
    		OPEN, CLOSE, MULTIPLICATION;
    	}
    OPEN.ordinal() vaut 0, CLOSE.ordinal() vaut 1, MULTIPLICATION.ordinal() vaut 2...

    La valeur de l'ordinal correspond également à l'index des valeurs dans le tableau renvoyé par la méthode static values :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    		OperatorType type1 = OperatorType.values()[0]; // OPEN
    		OperatorType type2 = OperatorType.values()[1]; // CLOSE
    		OperatorType type3 = OperatorType.values()[2]; // MULTIPLICATION

    Le plus propre étant bien sûr de se faire une méthode static d'accès :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    	public enum OperatorType {
    		OPEN, CLOSE, MULTIPLICATION;
     
    		public static OperatorType getByOrdinal(int ordinal) {
    			return OperatorType.values()[ordinal];
    		}
    	}

    Attention toutefois cette solution ne peut marcher que si tu utilises un ordre normal (0, 1, 2, 3, ...) sans interruption ni saut. Si tu utilises d'autre identifiant numérique non ordonné de la sorte il faut gérer cela toi même !


    En utilisant la méthode values() et une boucle de recherche cela pourrait faire l'affaire, par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    	public enum OperatorType {
    		OPEN(0), CLOSE(10), MULTIPLICATION(100);
     
     
    		private final int id;
     
    		private OperatorType(int id) {
    			this.id = id;
    		}
     
    		public static OperatorType getByID(int id) {
    			for (OperatorType type : OperatorType.values()) {
    				if (type.id == id) return type;
    			}
    			throw new IllegalArgumentException();
    		}
    	}

    a++

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Pb set quoted identifier
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 19/12/2005, 13h43
  2. Pb Set quoted Identifier
    Par Yanmeunier dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 05/12/2005, 10h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo