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 :

des enum sécurisés et propres


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut des enum sécurisés et propres
    J'ai un petit soucis avec les enums. Je n'arrive pas à trouver une solution qui me convienne pleinement.

    Pour l'instant j'utilise ce genre de chose:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    public static final int SEASON_WINTER  = 0;
    public static final int SEASON_SPRING   = 1;
    public static final int SEASON_SUMMER = 2;
    public static final int SEASON_FALL      = 3;
    .
    .
    .
    int x=SEASON_WINTER;
    mais c'est pas terrible car ne me garanti que les valeurs sont bien distinctes.

    Quand à la variante suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public static class season{
      public static int winter()   {return 0;}
      public static int spring()   {return 1;}
      public static int summer() {return 2;}
      public static int fall()       {return 3;}
    }
    .
    .
    .
    int x=season.winter();
    c'est à peu de chose près la même chose.

    Je pensai avoir trouvé mon bonheur avec enum qui fleurait bon le c.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    enum Season { WINTER, SPRING, SUMMER, FALL }
    .
    .
    .
    int x=Season.WINTER.getOrdinal();
    Mais je ne peux pas utiliser directement Season.WINTER comme un int.
    Et le getOrdinal() est un peu lourdot.

    Je pense donc que je passe à côté de qqchose.
    Merci de me dire quoi.

  2. #2
    Membre chevronné Avatar de schniouf
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    382
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Luxembourg

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2003
    Messages : 382
    Par défaut
    Tu mets ta variable x en type Season :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Season x = Season.WINTER ;

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

    Citation Envoyé par schniouf
    Tu mets ta variable x en type Season :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Season x = Season.WINTER ;
    +1

    Et bien sur les enum peuvent être utilisées directement dans un switch



    Citation Envoyé par JMLLB
    Je pensai avoir trouvé mon bonheur avec enum qui fleurait bon le c.
    Ca fleure bon le C, mais cela reste de l'Orienté Objet puisque le type enum correspond à un objet (avec éventuellement constructeurs, méthodes et attributs).


    a++

  4. #4
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par schniouf
    Tu mets ta variable x en type Season :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Season x = Season.WINTER ;
    Ok, ok!

    Mais lorsque tu n'as pas le choix du typage de ta variable?
    Dans le cas où elle peut-être affectée par plusieurs enum où tout simplement qu'elle se modifie via un accesseur qui t'impose un type.

    Pense pas que le cast explicite soit sans risque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = (int) Season.WINTER ;

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par JMLLB
    Pense pas que le cast explicite soit sans risque.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int x = (int) Season.WINTER ;
    Est-ce que tu fais du code du genre:
    Je ne pense pas... Donc pourquoi veux-tu faire de même pour int <- enum ?

  6. #6
    Membre éclairé
    Avatar de JMLLB
    Inscrit en
    Septembre 2006
    Messages
    285
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 285
    Par défaut
    Citation Envoyé par ®om
    Est-ce que tu fais du code du genre:
    Je ne pense pas... Donc pourquoi veux-tu faire de même pour int <- enum ?
    Je n'ai aucune intention de faire des casts trans-genres.
    Mon intention était juste de mettre en évidence que là où j'aurai besoin d'un int, je me retrouve avec un objet.
    Et qu'il n'y a pas de transcodage immédiat et syntaxement léger entre les deux.

    Dans le cas de figure où on n'a pas la maitrise de la totalité du développement,
    on ne peut pas imposer l'utilisation d'enum sur les ressources qu'on utilise.

    Par exemple, mettons que je souhaite gérer l'accès des JComponent dans un JTabbedPane via un enum.
    La grande majorité des méthodes du JTabbedPane utilisent l'index du JTabbedPane qui n'est autre qu'un int.
    Utiliser un enum m'impose une syntaxte lourde car je doit manipuler des int.
    Dans ce cas de figure, j'utilise plutôt un set de constantes par soucis de facilité,
    alors que : fonctionnellement je devrais utiliser un enum.

    Ma question est donc la suivante: dans ce cas de figure où l'on doit utiliser des int,
    existe t'il une solution aussi sécurisé que les enums et aussi "fluide" que des constantes?


    PS: il va sans dire que l'exemple donné impose une utilisation "statique" du JTabbedPane
    (pas de suppression ni d'ajout en cours d'utilisation) sous peine d'avoir des indices abérrants.

  7. #7
    Membre émérite Avatar de benratti
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    471
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mai 2004
    Messages : 471
    Par défaut
    je suis peux être a coté de la plaque mais je vais proposer quelquechose qui me semble tout con

    A coté de tes enum, tu peux definir une methode qui te converti ton enum en int.

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

Discussions similaires

  1. Comment gérer des sous ensembles avec des "enum" ?
    Par ogattaz dans le forum Langage
    Réponses: 2
    Dernier message: 30/05/2007, 10h29
  2. Une solution pour faire des enums dynamique ?
    Par n!co dans le forum Langage
    Réponses: 7
    Dernier message: 16/12/2006, 14h44
  3. Cette page contient des éléments sécurisés et non sécurisés
    Par bigsister dans le forum Balisage (X)HTML et validation W3C
    Réponses: 5
    Dernier message: 26/04/2005, 14h01
  4. chercher des données dans sa propre requete...
    Par shadowbob dans le forum Requêtes
    Réponses: 4
    Dernier message: 27/06/2004, 17h13

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