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 :

[Debutant(e)]définir les valeurs possibles d'un param


Sujet :

Langage Java

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 13
    Points
    13
    Par défaut [Debutant(e)]définir les valeurs possibles d'un param
    J'ai une méthode :
    public donneeSortie read(donneeEntree dE, String comportement)
    où le paramètre comportement définit l'action qui sera effectuée pour remplir mon donneeSortie avant de faire le return.
    Comportement peut prendre 3 (et seulement 3) valeurs différentes : ABT, NUL, DEF.

    Je voudrais pouvoir empecher les utilisateurs de mettre autre chose dans comportement quand ils font appel à cette méthode en ne leur proposant que les 3 valeurs possibles et en générant une erreur s'ils mettent autre chose.

    Je voulais utiliser des static final string dans ma classe, dire de les utiliser dans la javadoc et renvoyer une exception quand comportement contient autre chose mais ça plaît pas à mon chef (qui est un pro VB et qui m'a dit qu'on pouvait faire ça simplement en VB alors qu'il fallait que j'arrive à faire pareil en java !!!).





    [Modéré par Didier]
    Ajout de tag dans le titre
    Lire les règles du forum : Règles du forum Java

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,

    Il faut utiliser des énumération.

    Si tu utilises Java 1.4 ou inférieur, tu as un exemples dans la FAQ :
    http://java.developpez.com/faq/java/?page=divers#LANGAGE_enumeration
    Je pense que la solution numéro 2 est la plus approprié.

    C'est assez similaire à l'utilisation de String final static mais cela te permet de bloquer à la compilation les autres valeurs...

    Si tu utilises java 1.5, je te conseilles de jeter un coups d'oeil à l'article de Lionel Roux sur les nouveautés de Java 1.5, et en particulier la partie sur les énumérations

    a++

    [edit]
    J'ai oublié de préciser que si tu utilises Java 1.5 et le type enum, tu perds toute compatibilité avec les JVM inférieur...

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 13
    Points
    13
    Par défaut
    J'utilise java 1.4, la solution n°2 a l'air de faire ce que je veux. Si je comprends bien le fonctionnement, pour moi ça donnerait :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    public final class comportement {
            private comportement() {
                    /** Rien à faire */
            } 
     
            /** liste des valeurs */
            public final static comportement ABT = new comportement();
            public final static comportement DEF = new comportement();
            public final static comportement NUL = new comportement();
    }
    et pour ma méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public donneeSortie read(donneeEntree dE, comportement comport){
    ...
     
    return donneeSortie
    }
    et quand on utilise la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(dEntree, comportement.ABT);
    Par contre comment je fais pour tester quel comportement a été saisi ?

  4. #4
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Tu peux faire une succession de if/else pour différencier les différents cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (comport == null) {
    	// Si null est passé en paramètre
    } else if (comport == comportement.ABC) {
    	// Cas ABC
    } else if (comport == comportement.DEF) {
    	// Cas DEF
    } else if (comport == comportement.NUL) {
    	// Cas NUL
    }
    N'oublie pas de gerer le cas de null car rien n'empeche celui qui utilise ta méthode de faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    read(dEntree, null);
    Si tu ne veux pas faire un cas supplémentaire pour null, tu peux l'assigner à une de tes valeurs :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     public final static comportement NUL = null
    Dans ce cas les deux appels suivant seront équivalent :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    read(dEntree, null);
    read(dEntree, comportement.NUL);
    a++

    PS : En général les noms de Classe commencent par une majuscule !

  5. #5
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut je pense que...
    je pense que pour etre sur que l'utilisateur ne choisit pas de comprtement autre que ceux que tu veux je te suggere de les générés pour l'utilisateur à l'execution.

    avec un peu d'héritage et le pattern Factory tu devrait y arriver. Si tu veux plus d'info, dis-le et je te repondrais....mais je te laisse chercher un peu d'abord, c tj mieux et plus gratifiant de trouver par soi même ;-)

    waddle

    --
    EPITA Student
    Promo 2006
    Waddle

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Avril 2004
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2004
    Messages : 11
    Points : 11
    Points
    11
    Par défaut
    Si tu es prêt à taper quelques lignes de code en plus, tu peux définir ta classe de la façon suivante :

    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 class Comportement
    {
        public static final int ABT_VALUE  = 0;
        public static final int DEF_VALUE  = 1;
        public static final int NUL_VALUE = 2;
     
        public static final EdfaCurveType ABT = new EdfaCurveType(ABT_VALUE);
        public static final EdfaCurveType DEF = new EdfaCurveType(DEF_VALUE);
        public static final EdfaCurveType NUL = new EdfaCurveType(NUL_VALUE);
     
        public final int value;
     
        private Comportement(int value)
        {
            this.value = value;
        }
    }
    Cela te permettra de l'utiliser de façon un peu plus lisible avec un switch case :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    void foo(Comportement c)
    {
    	switch (c.value)
    	{
    		case Comportement.ABT_VALUE : abt(); break;
    		case Comportement.DEF_VALUE : def(); break;
    		case Comportement.NUL_VALUE : nul(); break;
    	}
    }
    [ Modéré par Bulbo ]
    Ajout des balises code
    Les Règles du Forum

  7. #7
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    40
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 40
    Points : 13
    Points
    13
    Par défaut
    Comme j'ai pas internet au boulot , j'ai utilisé la méthode qu'adiGuba m'a posté hier soir (et ça fonctionne très bien). Mais je garde quand même celle de JPigKeud sous le bras parceque pouvoir utiliser le switch c pas mal. Par contre, j'ai pas compris où voulais en venir waddle.

    En tout cas merci à tous pour votre rapidité.

  8. #8
    Membre régulier
    Inscrit en
    Novembre 2004
    Messages
    76
    Détails du profil
    Informations forums :
    Inscription : Novembre 2004
    Messages : 76
    Points : 88
    Points
    88
    Par défaut je m explique...
    je te conseillerai de faire un heritage entre tes comportements:

    public abstract class Comportement ....

    public class Abt extends Comportement ....

    .....

    apres a cote tu crés une factory (pattern Factory)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    public class ComportementFactory
    {
    public Comportement create(String configuration)
    {
    if (configuration.equals ("toto")
        return new Abt();
    else if ......
    ...........
    else
          throw new MyExceptionDunCasInconnu();
    }
    }
    le string configuration passer en parametre a create peut etre autre chose qu'un String si tu veux.

    avantages de cette methode, en cas d'ajout d'un nouveau comportement il te suffit de le sous classer de Comportement et de rajouter un cas dans ton create. et c tout.

    en plus, ici l'heritage pourrait te servir par exemple a definir des methodes abstraites dans comportement afin de definir ce que doivent faire les differents comportements (actuels ou futurs).

    cette definition de methode abstraite te permet de separer le code metier du code d'un comportement (puisqu'il respectent tous la meme API definie dans Comportement). De plus, le code metier se fou du comportement qu il manipule donc la correlation est faible (c mieux). Et l ajout de nouveaux comportement ne touche pas a ton code metier.

    le pattern Factory peut d'ailleur etre combiné avec le pattern Singleton dans le cas ou plusieurs classes ont besoin de cette factory et que les instances n'ont pas de sens dans leur utilisation.

    waddle

    --
    EPITA Student
    Promo 2006
    Waddle

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

Discussions similaires

  1. "Définir les valeurs par défaut" pour un "Champs de Paramètre"
    Par JaRuZ dans le forum SAP Crystal Reports
    Réponses: 11
    Dernier message: 21/10/2008, 14h06
  2. sélectionner toutes les valeurs possibles d'un champs
    Par _developpeur_ dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 22/10/2007, 18h32
  3. Réponses: 4
    Dernier message: 18/09/2007, 00h32
  4. Récupérer les valeurs possibles d'un champ
    Par setsuko dans le forum PostgreSQL
    Réponses: 2
    Dernier message: 17/08/2006, 16h15
  5. Comment dééfinir les valeurs des abscisses en Time ?
    Par marsupilami34 dans le forum Langage
    Réponses: 1
    Dernier message: 29/09/2005, 15h50

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