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 :

nom de fonction passée comme paramètre


Sujet :

Langage Java

  1. #1
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Par défaut nom de fonction passée comme paramètre
    Bonjour,

    je suis en train de développer une app dans laquel j'ai les deux méthodes suivantes mais en fait j'en ai une dizaine identiques:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private boolean hasSegm(List<Reportparameters> repParams) {
    		boolean hasIt = false;
    		int i = 0;
    		while (repParams!=null && !hasIt && repParams.size() > 0  && i < repParams.size()){
    			Reportparameters param = repParams.get(i);
    			if (param.getHassegm())
    				hasIt = true;
    			i++;
    		}
    		return hasIt;
    	}
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private boolean hasIndustries(List<Reportparameters> repParams) {
    		boolean hasIt = false;
    		int i = 0;
    		while (repParams!=null && !hasIt && repParams.size() > 0  && i < repParams.size()){
    			Reportparameters param = repParams.get(i);
    			if (param.getHasindustry())
    				hasIt = true;
    			i++;
    		}
    		return hasIt;
    	}

    comme on peut le remarquer la seule chose qui varie mis à part le nom de la méthode, c'est le nom de de la méthode qui est appelée à l'intérieur
    à savoir param.getHassegm() dans la premiere et param.getHasindustry() dans la deuxième.


    je me demande alors si il exite un moyen de faire une fonction générique qui prendrait un param supplémentaire qui serait le nom de la fonction qui sert de test

    un truc du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    	private boolean hasIt(List<Reportparameters> repParams, <?> maFunctionDeTest) {
    		boolean hasIt = false;
    		int i = 0;
    		while (repParams!=null && !hasIt && repParams.size() > 0  && i < repParams.size()){
    			Reportparameters param = repParams.get(i);
    			if ( eval (maFunctionDeTest) on param )
    				hasIt = true;
    			i++;
    		}
    		return hasIt;
    	}

    merci pour votre aide

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    Septembre 2004
    Messages
    12 585
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 585
    Par défaut
    Hello, il y a des moyens de faire ça en Java, oui. Grosso-modo deux :

    # 1 - L'introspection : invoquer la méthode d'une classe par son nom

    ça peut se faire par exemple comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    private boolean hasIt(List<Reportparameters> repParams, String predicateMethodName) throws ReflectiveOperationException {
     
      Method method = Reportparameters.class.getMethod(predicateMethodName);
     
      Reportparameters param = repParams.get(0);
     
      if((Boolean)method.invoke(param)) {
        return true;
      }
     
      return false;
    }
    qui s'appellerait comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hasIt(repParams, "getHassegm");
    Avantage :
    - c'est exactement ce que tu essayais de faire dans ta tête

    Inconvénients :
    - ce n'est pas très lisible
    - le compilateur ne vérifie plus si les méthodes qu'on cherche à appeler existent et sont correctement appelées. Les erreurs ne se verront qu'en essayant.

    # 2 - Le prédicat : la manière objet.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    private boolean hasIt(List<Reportparameters> repParams, Predicate<Reportparameters> predicate) {
     
      Reportparameters param = repParams.get(0);
     
      if(predicate.test(param)) {
        return true;
      }
     
      return false;
    }
    qu'on appellerait comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hasIt(params, p -> p.getHassegm());
    ou comme ceci, c'est pareil :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    hasIt(params, Reportparameters::getHassegm);
    - le compilateur vérifie tout
    - on se traîne pas des casts et des exceptions à rallonge
    - par contre il faut s'habituer à penser comme ça
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    Avatar de tchize_
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2007
    Messages
    25 482
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : Belgique

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Avril 2007
    Messages : 25 482
    Par défaut
    Citation Envoyé par somnix Voir le message

    je me demande alors si il exite un moyen de faire une fonction générique qui prendrait un param supplémentaire qui serait le nom de la fonction qui sert de test
    Ca s'appelle un predicat, comme thelvin l'a dit.

    C'est assez court pour toi ça? On peut diffciliment faire plus court

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    List<Reportparameters> reportParameters = .....;
    boolean anyIndutryPresent = reportParameters.stream().anyMatch(Reportparameters::getHasindustry);

    Parfois je regrette d'être coincé avec java 6 au boulot

  4. #4
    Membre confirmé
    Homme Profil pro
    Développeur Java
    Inscrit en
    Novembre 2009
    Messages
    72
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Développeur Java

    Informations forums :
    Inscription : Novembre 2009
    Messages : 72
    Par défaut génial
    merci beaucoup pour vos réponses !!!

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

Discussions similaires

  1. Imprimer le nom de fonction passée en paramètre
    Par aral510 dans le forum Linux
    Réponses: 5
    Dernier message: 27/06/2012, 15h57
  2. Réponses: 8
    Dernier message: 12/08/2011, 09h25
  3. Réponses: 8
    Dernier message: 29/08/2006, 18h36
  4. surcharge de fonction avec comme paramètre Object
    Par poporiding dans le forum C++
    Réponses: 8
    Dernier message: 14/07/2006, 03h47
  5. Réponses: 10
    Dernier message: 04/07/2006, 20h57

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