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 :

[Conception] Passer une fonction en paramètre [Trucs & Astuces]


Sujet :

Langage Java

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 4
    Points : 3
    Points
    3
    Par défaut [Conception] Passer une fonction en paramètre
    Bonjour,

    j'aimerai savoir si c'est possible de passer une fonction comme argument comme en C. merci
    [ Modéré par vedaer ]
    -> Ajout du tag dans le titre
    [ Merci de respecter les Règles du Forum ]

  2. #2
    Membre émérite
    Avatar de xavlours
    Inscrit en
    Février 2004
    Messages
    1 832
    Détails du profil
    Informations forums :
    Inscription : Février 2004
    Messages : 1 832
    Points : 2 410
    Points
    2 410
    Par défaut
    Il me semble fortement que non, sauf dans le cas exceptionnel de la réflexion.
    Pour passer une fonction en parametre (par exemple actionPerformed() ) il faut écrire :
    • Une interface qui donne le nom de ta fonction (par exemple actionListener)
      Une classe qui implémente cette interface : elle donne le corps de la fonction
      Tu passes un objet de cette classe en paramètre

    Exemple : pour les boutons de l'interface graphique, on veut spécifier au bouton quelle fonction exécuter quand on clique dessus :
    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
    //l'interface existe déja, elle s'appelle ActionListener, et elle définit une seule méthode :
    //public void actionPerformed(ActionEvent e);
     
    public class MaClasse implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.out.println("Vous avez cliqué sur le bouton !!");
        }
    }
     
    public class ClasseUtilisantUnBouton {
     
    ....
            monBouton.addActionListener(new MaClasse());
    ....
    }
    Le bouton ira chercher tout seul la methode (= fonction) actionPerformed dans l'objet que tu lui as donné.
    Ai-je été clair ?
    "Le bon ni le mauvais ne me feraient de peine si si si je savais que j'en aurais l'étrenne." B.V.
    Non au langage SMS ! Je ne répondrai pas aux questions techniques par MP.
    Eclipse : News, FAQ, Cours, Livres, Blogs.Et moi.

  3. #3
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    95
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 95
    Points : 140
    Points
    140
    Par défaut
    Tu veux plutôt dire méthode ? Je pense que oui puisqu'il existe la classe Method (java.lang.reflect.Method). Ceci dit, la "logique java" veut qu'on ne fait jamais ce genre de chose en pratique (contrairement au langage C). Je sais pas ce que tu veux faire, mais est-ce qu'une interface contenant ta méthode à appeller ne résoudrait pas ton problème ?

    Exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    public interface Executable {
      public void execute() ;
    }
    Et tu passes un Executable en paramètre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    public void uneFonction(Executable maFonctionParametre) { ... }
    Enfin, je pense que tu saisies l'idée ?

  4. #4
    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 bouhhhhh
    bouhhhhhhhhh du C, oust le C !!!!!!!

    pk diable vouloir faire ça en objet ??? je suis curieux...
    Waddle

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2003
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2003
    Messages : 63
    Points : 68
    Points
    68
    Par défaut
    C'est possible en passant par la classe Class et les classes qui en dépendent : Method, Attribute, etc.
    Grosso modo, il faut
    - récupérer un objet représentant ta classe java (de classe Class, à ne pas confondre avec une instance de ta classe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Class maClasse = Class.forName("NomDeMaClasse");
    (il y a un try catch autour normalement)
    - récupérer la méthode qui t'intéresse en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Method maMethode = maClasse.getMethod("nomMethode", parameters);
    où parameters est un tableau d'objets définissant le squelette de ta méthode.
    - et enfin tu pourras l'évoquer en faisant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    maMethode.invoke(instance, parameters);
    où "instance" est l'instance de la classe sur laquelle tu veux appeler ta méthode et parameters le tableau content les valeurs des parametres.

    Pour plus d'infos, voir la javadoc du java.sun.com

  6. #6
    Membre régulier Avatar de jerome.petit
    Inscrit en
    Novembre 2002
    Messages
    78
    Détails du profil
    Informations forums :
    Inscription : Novembre 2002
    Messages : 78
    Points : 96
    Points
    96
    Par défaut Re: bouhhhhh
    Citation Envoyé par waddle
    bouhhhhhhhhh du C, oust le C !!!!!!!

    pk diable vouloir faire ça en objet ??? je suis curieux...
    Pour implémenter un callback, pour faire de l'IoC etc

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Mars 2002
    Messages
    652
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Mars 2002
    Messages : 652
    Points : 1 151
    Points
    1 151
    Par défaut
    Plus sérieusement, sans mettre en avant le C ou même le dénigrer, oui, celà ce pratique assez courament en Java.

    Il te suffit de fournir l'instance de la classe qui implémente la méthode désirée en paramètre.
    Pour pouvoir changer "à la volée" sans recompiler ou... pouvoir choisir l'instance selon tes critères, il suffit simplement que toutes les instances potentielles implémentent la même interface.

    Je te conseille vivement de regarder du coté des classes Event utilisées par swing mais que j'utilise aussi à d'autre fins que Swing ( comportement métier entre autre )

    Tu doit pouvoir trouver des infos du coté de la spèc JavaBean aussi. Le modèle des listener en est un exemple concret utilisé par tous depuis bien longtemps.
    Clic me...
    CV en ligne

    Il y a 10 types de personnes, celui qui connait le binaire, et l'autre...

    Pas de réponse en MP...Merci

  8. #8
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Sans passer par des évènements ou d'autres techniques, il y a un design pattern pour ça : l'Itérateur. En tout cas ça l'illustre. Ca ressemble un peu à ce que propose Alwin. J'avais implanté ça à l'intérieur d'un Interpréteur (autre design pattern) pour pouvoir faire des traitement différents sur mon arbre syntaxique. En gros le principe est simple.

    Tu définis une interface avec une seule méthode genre executer :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    public interface Iterateur{
      public void executer(); 
    }
    Ta méthode peut prendre des paramètres et retourner quelque chose mais j'ai simplifié pour l'exemple. Au passage je viens de réaliser qu'avec la généricité de Tiger, l'implémentation d'un tel design pattern gagne en souplesse... m'enfin bon, on s'écarte du sujet.

    Ensuite, tu crées des classes qui implémentent cette méthode pour pouvoir fournir un corps à ta méthode.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    public class Compiler implements Iterateur{
      public void executer(){
        //ton code ici
      }
    }
     
    public class GenererDoc implements Iterateur{
      public void executer(){
        //ton code ici
      }
    }
    Et ensuite dans ton code tu peux faire appel dynamiquement au comportement qui t'intéresse. Mettons que tu définisse une méthode comme ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void parcourir(Iterateur it){
      //va chercher le fichier à parcourir
      it.executer();
      //ferme le fichier
    }
    Et ensuite dans ta méthode principale il te suffit d'appeler :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    parcourir(new Compiler());
    parcourir(new GenererDoc());
    Alors on est loin des quelques lignes de code que ça demande en C, mais en même temps je trouve ça plutôt élégant. Et puis de toute façon on peut difficilement faire mieux vu que pour pouvoir faire comme en C, il faudrait avoir des pointeurs et ça... hors de question ! Et c'est bien mieux comme ça !

    Bon courage @+++
    Sébastien ARBOGAST
    SCJP

  9. #9
    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 t es sur ???
    t'es sur que c pas plutot le pattern Visiteur que tu voulais dire à la place de Iterateur ??? parce que là ca y ressemble drolement...

    et puis les pointeurs en Java y en a partout sauf q'ils se cachent les malins..... 8) 8)
    Waddle

  10. #10
    Membre averti
    Avatar de rozwel
    Inscrit en
    Mars 2002
    Messages
    324
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 324
    Points : 334
    Points
    334
    Par défaut
    Voilà c'est exactement ça... c'est le Visiteur tu as complètement raison... il me semblait bien aussi. mea culpa !

    Iterateur existe aussi mais c'est pour parcourir des collections donc rien à voir. Désolé...
    Sébastien ARBOGAST
    SCJP

Discussions similaires

  1. Passer une fonction en paramètre
    Par jalane dans le forum C
    Réponses: 7
    Dernier message: 03/11/2012, 13h29
  2. Réponses: 16
    Dernier message: 26/05/2009, 13h32
  3. Passer une fonction en paramètre, sans delegate
    Par deejay2221 dans le forum C#
    Réponses: 8
    Dernier message: 26/03/2009, 20h22
  4. Réponses: 15
    Dernier message: 02/08/2007, 11h17
  5. Passer une fonction en paramètre ...
    Par Freeze dans le forum C++Builder
    Réponses: 2
    Dernier message: 14/10/2005, 16h51

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