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 :

Parametre variables en nombre et en type


Sujet :

Langage Java

  1. #1
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut Parametre variables en nombre et en type
    Bonjour a tous,

    Voila mon petit probleme : Je suis sous java 1.4 !!

    Je voudrais un moyen de regrouper tous les parametres passés à une méthode dans une hashtable sans le faire manuellement.

    Je veux donc récupérer les parametres et les passer à une méthode hérité qui me renvoi une hashtable avec tous les parametres dedans. Le problème est que la méthode qui fait ça doit etre générique et doit donc fonctionner avec différente signature...

    Pour ceci, il me faudrait un truc du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    hashtable mamethode(Object... param)
    Mais je suis sous java 1.4, donc, pas possible... Mais il me faudrait un truc pour faire comme ci !!

    Merci beaucoup !!

  2. #2
    Membre actif Avatar de g0up1l
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    341
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 341
    Points : 294
    Points
    294
    Par défaut
    Si tous tes paramètres héritent de Object, tu peux passer à ta méthode un Vector d'objets 'Object'
    Hope it helps !
    Nouveau ! Il y a une vie après le java, oxygénez-vous

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

    Citation Envoyé par g0up1l
    Si tous tes paramètres héritent de Object, tu peux passer à ta méthode un Vector d'objets 'Object'
    Ou tout simplement un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mamethode(Object[] param)
    Que tu appeleras ensuite de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mamethode(new Object[]{ param1, param2, param3, param4 } );

    C'est ce qui se rapproche le plus de l'ellipse de Java 5.0...

    a++

  4. #4
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Citation Envoyé par adiGuba

    Ou tout simplement un tableau :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mamethode(Object[] param)
    Que tu appeleras ensuite de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    mamethode(new Object[]{ param1, param2, param3, param4 } );
    Je vais proposer ça, Merci bien !!
    Malheureusement, je pense que c'est pas possible autrement...

    Je supose que trouver un moyen ou on utiliserait directement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mamethode(param1, param2, param3, param4)
    C'est pas possible ??

  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
    Points : 3 080
    Points
    3 080
    Par défaut
    Citation Envoyé par tinico
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    mamethode(param1, param2, param3, param4)
    C'est pas possible ??
    C'est pour ça que l'ellipse a été ajoutée... Donc sans l'ellipse, non...

  6. #6
    Membre chevronné
    Homme Profil pro
    Directeur technique
    Inscrit en
    Janvier 2007
    Messages
    1 348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Janvier 2007
    Messages : 1 348
    Points : 1 787
    Points
    1 787
    Par défaut
    Ah ben non pas en 1.4 c'est justement à ça que sert l'ellipse ...

    Edit : eh zut trop lent

  7. #7
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    Je m'en doutais un peu, mais je preferais avoir confirmation !!

    Ok, et bien, si cela est le plus simple, je valide !!!

    MERCI BEAUCOUP pour votre efficacité et votre rapidité (surtout)

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


    Une autre solution serait d'utiliser une classe qui engloberait les paramètres pour les stocker dans une List, 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    public class VarArg {
     
    	// Liste des paramètres
    	private List paramList = new ArrayList();
     
    	// Constructeur privée pour empêcher les créations directes
    	private VarArg() {
     
    	}
     
    	// Méthode statique d'intialisation
    	public static VarArg init(Object arg) {
    		return new VarArg().add(arg);
    	}
     
    	// Ajout de paramètre :
    	public VarArg add(Object arg) {
    		this.paramList.add(arg);
    		return this;
    	}
     
    	// package-view pour empêcher d'utiliser la méthode
    	List getParamList() {
    		return paramList;
    	}
    }

    Et avec une méthode du style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	public void method(VarArg vararg) {
    		if (vararg!=null) {
    			Iterator iterator = vararg.getParamList().iterator();
    			while (iterator.hasNext()) {
    				Object param = iterator.next();
     
    				// Traitement du paramètre 
     
    			}
    		}
    	}
    On peut l'utiliser de la manière suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.method( VarArg.init(param1).add(param2).add(param3).add(param4) );
    Mais ce n'est pas forcément plus lisible...

    a++

  9. #9
    Membre régulier
    Inscrit en
    Janvier 2007
    Messages
    137
    Détails du profil
    Informations personnelles :
    Âge : 40

    Informations forums :
    Inscription : Janvier 2007
    Messages : 137
    Points : 99
    Points
    99
    Par défaut
    oula oui !!

    C'est meme moins lisible !! hi hi
    Je pense que je vais rester sur ma premiere solution, elle me parrait plus sure et plus lisible !

    Merci quand meme

  10. #10
    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
    Citation Envoyé par tinico
    oula oui !!

    C'est meme moins lisible !! hi hi
    J'avais prévenu


    Cette solution à toutefois quelques avantages (tant que j'y suis je développe ) :

    • Elle permet de définir des restrictions sur les types autorisé sans pour autant qu'il y ait de relation entre les deux. Par exemple si on souhaite accepter seulement les type String et Date il suffit d'utiliser la surcharge de méthode, 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
      	// Ajout de paramètre (private pour qu'elle ne puisse pas être utilisé directement:
      	private VarArg addObject(Object arg) {
      		this.paramList.add(arg);
      		return this;
      	}
       
      	// On autorise l'ajout de paramètre de type String
      	public VarArg add(String arg) {
      		return this.addObject(arg);
      	}
       
      	// On autorise l'ajout de paramètre de type Date
      	public VarArg add(Date arg) {
      		return this.addObject(arg);
      	}
    • Elle permet également de gérer les types primitives de manière transparente (en gérant une espèce d'autoboxing). Ceci encore une fois avec la surcharge de méthode :
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      	// Ajout de paramètre de type int :
      	public VarArg add(int arg) {
      		return add(new Integer(arg));
      	}




    Mais il faut également dire que la première solution a un gros avantage : elle sera très facile à migrer vers Java 5.0 !!!

    Exemple de code Java 1.4 :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    	public void method(Object[] args) {
    		...
    	}
    Qui est appelé comme cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.method( new Object[] { param1, param2, param3, param4 } );

    Et pour pouvoir utiliser l'ellipse de Java 5.0 il suffira de modifier la déclaration du tableau dans la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void method(Object... args) {
    Comme l'ellipse est en fait un tableau il n'y aura rien à changer dans le code de la méthode, et on pourra alors utiliser la syntaxe courte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.method( param1, param2, param3, param4 );

    Mais le principal avantage vient du fait que l'ancienne syntaxe continuera de fonctionner sans problèmes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    obj.method( new Object[] { param1, param2, param3, param4 } );
    Il sera inutile de modifier tous les appels de méthodes existants

    a++

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

Discussions similaires

  1. Nombre de parametres variables
    Par Mercenary Developer dans le forum C
    Réponses: 17
    Dernier message: 26/07/2007, 07h54
  2. Réponses: 9
    Dernier message: 15/05/2007, 12h41
  3. [XSL~FO] Nombre de paramètres variable
    Par Androrion dans le forum XSL/XSLT/XPATH
    Réponses: 6
    Dernier message: 25/08/2006, 17h45
  4. Fonction Execlp avec nombre parametres variable
    Par laurent_ifips dans le forum C
    Réponses: 3
    Dernier message: 25/11/2005, 20h14
  5. Réponses: 9
    Dernier message: 22/07/2005, 16h10

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