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 :

Enumération initialisées en runtime


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut Enumération initialisées en runtime
    Bonjour tout le monde,

    J'ai un problème pûrement algorithmique assez gênant et délicat que je voudrais soumettre à votre sagacité.

    Je travaille sur une application J2EE dans laquelle tous les types énumérés sont stockés dans la base de données. Autrement dit, en fonction du type énuméré, certains ont leurs propres tables avec un code et un texte dans toutes les langues, tandis que d'autres sont stockés dans une table générique avec une colonne pour identifier le type, et un lien vers une autre table qui contient les textes dans toutes les langues.

    Par exemple, le type enuméré exprimé en Java5 comme suit:
    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 enum PrinterType{
      LASER(new String[][]{
        {"fr", "Imprimante laser"},
        {"en", "Laser Printer"}
      }),
      BUBBLE_JET(new String[][]{
        {"fr", "Imprimante à jet d'encre"},
        {"en","Bubble jet printer"}
      }),
      SUBLIMATION(new String[][]{
        {"fr", "Imprimante à sublimation thermique"},
        {"en", "Thermal sublimation printer"}
      });
     
      private Map<String, String> texts;
     
      private PrinterType(String[][] texts){
        texts = new HashMap<String, String>();
        for(String[] text : texts){
          texts.put(text[0], text[1]);
        }
      }
     
      public getText(String language){
        return texts.get(language);
      }
    }
    Va pouvoir être représentée dans la table générique TYPE sous la forme suivante:
    - family='PRN_TYPE', code='LASER', text='1'
    - family='PRN_TYPE', code='BUBBLE_JET', text='2'
    - family='PRN_TYPE', code='SUBLIMATION', text='3'

    Et dans la table TYPE_TEXT:
    - textid='1', language='fr', text='Imprimante laser'
    - textid='2', language='en', text='Laser Printer'
    -...

    Et bien sûr, l'utilisateur veut pouvoir modifier les caractéristiques de ces types énumérés en passant par la base sans avoir à toucher au code, ce qui rend l'approche type-safe enum prise en exemple complètement impensable. En fait, ni la liste des valeurs possibles pour un type, ni les textes associés à chacune des valeurs ne doit être hard-codée.

    Ma question est la suivante: est-ce que vous connaisser un design pattern ou un concept qui permet d'implémenter ce genre de choses en assurant un minimum de contrôle de type, tout en gardant la possibilité d'initialiser la liste des valeurs possibles et tous les attributs associés au moment de l'exécution du programme.

    Je suis sûr qu'il existe un moyen en faisant joujou avec les Generics mais pour l'instant je sèche un peu.

    Des suggestions?

  2. #2
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    première question: est ce que tes types d'imprimantes sont susceptible de varier souvent?
    en d'autre termes est ce que tu peux te contenter d'avoir un énuméré simple
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    enum PrintAgents {
        BUBBLE_GUM, LASER, SERGENT_MAJOR ;
    }
    ensuite tu peux t'en sortir de différentes manières
    simpliste: un EnumMap dont les valeurs sont un Properties langue=message
    plus politiquement correct serait une implantation de resourceBundle mais seule version 1.6 permettra de faire ça plus cool (je dis ça de mémoire)

  3. #3
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    Non justement c'est mon problème, je ne peux pas hardcoder ça comme ça parce que les utilisateurs veulent garder cette flexibilité de pouvoir modifier les types énumérés uniquement par la base de données.

    Par contre EnumMap effectivement je viens de voir ça dans l'API, je ne vois pas encore comment l'utiliser mais je vais fouiller. Si quelqu'un a un exemple, ce sera bienvenu.

  4. #4
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    Citation Envoyé par rozwel
    Non justement c'est mon problème, je ne peux pas hardcoder ça comme ça parce que les utilisateurs veulent garder cette flexibilité de pouvoir modifier les types énumérés uniquement par la base de données.
    donc c'est pas un énuméré.
    mais tu peux avoir une Hashmap<String, Properties> indexé par ton type imprimante et construite en bloc static.

  5. #5
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Citation Envoyé par professeur shadoko
    donc c'est pas un énuméré.
    Bien sûr que si. L'enum te garanti des objets type-safe, mais ne t'empêche absolument pas d'adjoindre des propriétés spécifiques et dynamiques tant qu'il n'y a pas d'ajout/suppression de type ou de modification de leur nom.

  6. #6
    Membre éclairé
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Par défaut
    J'ai déjà pensé à la solution de natha, mais même là l'utilisateur râle parce qu'on enlève la moitié de la flexibilité: la liste des valeurs possibles est hardcodée.

    J'ai aussi utilisé une approche à base de HashMap mais après mon problème c'est le type-safety.

  7. #7
    Membre Expert
    Avatar de professeur shadoko
    Homme Profil pro
    retraité nostalgique Java SE
    Inscrit en
    Juillet 2006
    Messages
    1 257
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 76
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : retraité nostalgique Java SE

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 257
    Par défaut
    ah que pas d'acc.
    je ne parle pas des propriétés de l'objet, je parle du fait qu'avec un énuméré on a une liste finie d'objet au compile-time.
    donc ma question est peut être mal posée: peut-on rajouter dynamiquement d'autre imprimantes? j'avais compris que oui -> donc pas énuméré

  8. #8
    Membre Expert
    Avatar de natha
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    2 346
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Janvier 2006
    Messages : 2 346
    Par défaut
    Alors nous on fait ça dans la boîte.

    On a des codes systèmes qui sont en base de données et pour lesquels on créée l'ENUM correspondante (les utilisateurs ne peuvent pas insérer de nouvelles entrées).

    On a une classe Code qui contient les propriétés de chaque objet de ce type (code, langue, nom entre autre)

    Dans nos enum on fait bêtement :

    Code Java : 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
    enum MonType {
     
        TOTO,
        TATA,
        TITI;
     
        Code m_code;
     
        Code getCode() {
            if (m_code == null) {
                loadCode();
            }
            return m_code;
        }
     
        void loadCode() {
            // récupération de l'objet en base de données
        }
     
    }

    Voilà brièvement. Est-ce que ça t'aide ?

Discussions similaires

  1. Enumération de l'arrangement Anp
    Par Morvan Mikael dans le forum Algorithmes et structures de données
    Réponses: 12
    Dernier message: 28/04/2003, 09h05
  2. Initialisation de XMLModule
    Par Sylvain Leray dans le forum XMLRAD
    Réponses: 10
    Dernier message: 01/04/2003, 10h08
  3. initialisation Directinput avec delphi
    Par Madmaxx dans le forum DirectX
    Réponses: 1
    Dernier message: 21/02/2003, 17h37
  4. Runtime VC++ ou MFC
    Par Elodie_nl dans le forum MFC
    Réponses: 9
    Dernier message: 03/12/2002, 17h23
  5. [Kylix] Runtime error 230 avec INDY
    Par Anonymous dans le forum EDI
    Réponses: 2
    Dernier message: 23/03/2002, 11h51

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