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 :

Convertir un int en une valeur d'enum


Sujet :

Langage Java

  1. #1
    Membre confirmé Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Par défaut Convertir un int en une valeur d'enum
    Salut

    J'ai une enum et je souhaiterais affecter une variable de ce type à partir d'une valeur int.
    A part un switch je n'ai pas trouvé d'autre syntaxe. Il doit bien y avoir mieux ?!
    Dans la doc il est interdit d'utiliser de constructeur public pour les enums.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public static enum ProtocoleVersion
    {
     VERSION_ONE(1), VERSION_TWO(2);
     int _version ;
     ProtocoleVersion(int version)
     {
      _version = version ;
     }
    }
     
    private ProtocoleVersion _protocoleVersion ;
     
    public void setProtocole( int protocoleVersion )
    {
     switch( protocoleVersion )
     {
      case 1:
       _protocoleVersion = ProtocoleVersion.VERSION_ONE ;
       break ;
      case 2:
       _protocoleVersion = ProtocoleVersion.VERSION_TWO ;
       break ;
      default:
       throw new Exception("Invalid protocole version");
     }
    }
    Je trouve pas comment faire mieux que le contenu de la méthode void setProtocole( int protocoleVersion ).

    Merci pour vos idées,
    cyrille

  2. #2
    Membre expérimenté
    Inscrit en
    Juin 2003
    Messages
    292
    Détails du profil
    Informations forums :
    Inscription : Juin 2003
    Messages : 292
    Par défaut
    Citation Envoyé par cyrille37 Voir le message
    Salut

    J'ai une enum et je souhaiterais affecter une variable de ce type à partir d'une valeur int.
    A part un switch je n'ai pas trouvé d'autre syntaxe. Il doit bien y avoir mieux ?!
    Dans la doc il est interdit d'utiliser de constructeur public pour les enums.

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
     
    public static enum ProtocoleVersion
    {
     VERSION_ONE(1), VERSION_TWO(2);
     int _version ;
     ProtocoleVersion(int version)
     {
      _version = version ;
     }
    }
     
    private ProtocoleVersion _protocoleVersion ;
     
    public void setProtocole( int protocoleVersion )
    {
     switch( protocoleVersion )
     {
      case 1:
       _protocoleVersion = ProtocoleVersion.VERSION_ONE ;
       break ;
      case 2:
       _protocoleVersion = ProtocoleVersion.VERSION_TWO ;
       break ;
      default:
       throw new Exception("Invalid protocole version");
     }
    }
    Je trouve pas comment faire mieux que le contenu de la méthode void setProtocole( int protocoleVersion ).

    Merci pour vos idées,
    cyrille
    pourquoi un switch te derange autant?

  3. #3
    Membre confirmé Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Par défaut
    Bon j'ai ajouté une méthode create(int) dan l'enum et là je suis satisfait ;-)

    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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    public static enum ProtocoleVersion
    {
     VERSION_ONE(1), VERSION_TWO(2);
     int _version ;
     ProtocoleVersion(int version)
     {
      _version = version ;
     }
     public static ProtocoleVersion create( int protocoleVersion )
     {
      switch( protocoleVersion )
      {
       case 1:
        return ProtocoleVersion.VERSION_ONE ;
       case 2:
        return ProtocoleVersion.VERSION_TWO ;
      }
      throw new Exception("Invalid protocole version");
     }
    }
     
    private ProtocoleVersion _protocoleVersion ;
     
    public void setProtocole( int protocoleVersion ) throws Exception
    {
       _protocoleVersion = ProtocoleVersion.create(protocoleVersion) ;
     }
    }

  4. #4
    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,

    C'est normal que tu ne puisses pas utiliser le constructeur d'enum puisque les valeurs des enums sont obligatoirement unique : tu ne peux pas dupliquer des valeurs !

    Les enums ont implicitement une numéro d'ordre correspondant à leurs ordre de déclaration, que tu peux éventuellement utiliser ici (même s'il commence à zéro) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    enum ProtocoleVersion {
    	VERSION_ONE, VERSION_TWO;
     
    	public static ProtocoleVersion create(int protocoleVersion) throws ArrayIndexOutOfBoundsException {
    		return ProtocoleVersion.values()[protocoleVersion-1];
    	}
    }

    Sinon si tu veux vraiment utiliser un attributs (par exemple si tes numéro de versions ne se suivent pas), je te conseillerais déjà d'utiliser un attribut final (pour éviter toute mauvaise manip dans le code de ton enum). Ensuite il serait plus simple de remplacer le switch par une boucle sur le tableau des valeurs :
    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
    enum ProtocoleVersion {
    	VERSION_ONE(1), VERSION_TWO(2);
    	final int _version;
     
    	ProtocoleVersion(int version) {
    		_version = version;
    	}
     
    	public static ProtocoleVersion create(int protocoleVersion) throws Exception {
    		for (ProtocoleVersion pv : ProtocoleVersion.values()) {
    			if (pv._version == protocoleVersion) {
    				return pv;
    			}
    		}
    		throw new Exception("Invalid protocole version");
    	}
    }
    Le code n'a pas à être modifié si tu rajoutes une valeur dans l'enum

    a++

  5. #5
    Membre confirmé Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Par défaut
    Super !
    C'est exactement une idée comme celle-ci que je cherchais.
    thank you very much.
    Cyrille

  6. #6
    Rédacteur/Modérateur

    Avatar de bouye
    Homme Profil pro
    Information Technologies Specialist (Scientific Computing)
    Inscrit en
    Août 2005
    Messages
    6 901
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Nouvelle-Calédonie

    Informations professionnelles :
    Activité : Information Technologies Specialist (Scientific Computing)
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Août 2005
    Messages : 6 901
    Billets dans le blog
    54
    Par défaut
    Reste que je ne pige toujours pas l'interret de cette maniere de faire/conception :
    - d'une part la valeur de l'enum est unique et donc suffit pour un switch.
    - d'autre part si jamais ce n'etait pas suffisant la methode ordinal() retourne l'indice de la valeur de l'enum et donc aussi suffit largement pour un switch.

    La methode indiquee par adiGuba est effectivement la bonne demarche a suivre mais dans ce cas autant directement surcharger la methode valueOf().
    Merci de penser au tag quand une réponse a été apportée à votre question. Aucune réponse ne sera donnée à des messages privés portant sur des questions d'ordre technique. Les forums sont là pour que vous y postiez publiquement vos problèmes.

    suivez mon blog sur Développez.

    Programming today is a race between software engineers striving to build bigger and better idiot-proof programs, and the universe trying to produce bigger and better idiots. So far, the universe is winning. ~ Rich Cook

  7. #7
    Membre confirmé Avatar de cyrille37
    Profil pro
    Développeur informatique
    Inscrit en
    Juin 2005
    Messages
    155
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Juin 2005
    Messages : 155
    Par défaut
    Citation Envoyé par bouye Voir le message
    dans ce cas autant directement surcharger la methode valueOf().
    Merci !
    En voilà de bonnes idées.
    Décidement je ne regrète pas d'avoir posé la question ;-)

    Merci
    Cyrille

  8. #8
    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
    Citation Envoyé par bouye Voir le message
    Reste que je ne pige toujours pas l'interret de cette maniere de faire/conception :
    - d'une part la valeur de l'enum est unique et donc suffit pour un switch.
    - d'autre part si jamais ce n'etait pas suffisant la methode ordinal() retourne l'indice de la valeur de l'enum et donc aussi suffit largement pour un switch.
    L'utilisation d'un attribut n'a pas pour objectif de remplacer ordinal(), mais plutôt d'associer une valeur à l'enum.
    En comparaison avec ordinal() cela apporte plusieurs avantages :
    • On peut utiliser des valeurs non-non-consécutives et pas forcément ordonnée.
    • On peut utiliser n'importe quel type de donnée.
    • On peut dupliquer des valeurs (deux enums différentes pourraient très bien avoir la même valeur logique)


    cela permet de gérer cela au niveau de l'enum et pas pas lors de son utilisation...


    a++

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

Discussions similaires

  1. [C++11] Convertir un int en une constexpr.
    Par Invité dans le forum Langage
    Réponses: 15
    Dernier message: 31/07/2014, 12h56
  2. insert int avec une valeur + un select
    Par polo86 dans le forum Requêtes
    Réponses: 2
    Dernier message: 29/05/2009, 12h25
  3. Réponses: 3
    Dernier message: 28/09/2006, 17h18
  4. [TAG] Convertir une valeur numérique en hh:mm:ss
    Par Rafiki dans le forum Taglibs
    Réponses: 6
    Dernier message: 09/06/2006, 13h21
  5. Convertir une valeur d'une zone de texte en date
    Par os_rasta dans le forum ASP
    Réponses: 17
    Dernier message: 27/02/2006, 15h56

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