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

avec Java Discussion :

Choix d'une classe pour appel de méthodes statiques


Sujet :

avec Java

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Par défaut Choix d'une classe pour appel de méthodes statiques
    Bonjour, voici mon problème:
    J'ai deux classes qui ne possèdent que des méthodes statiques (l'ensemble des méthodes est communes aux deux classes). Ces classes ne sont donc jamais instanciées dans mon programme.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class MaClasse {
     
    public static void maMethode(){...}
    public static void autreMethode(){...}
    }
     
    public class AutreClasse {
     
    public static void maMethode(){...}
    public static void autreMethode(){...}
    }
    Lorsque dans mon programme des appels à maMethode() sont effectué je souhaites pouvoir choisir entre l'appel de MaClasse.maMethode(); ou AutreClasse.maMethode(); selon une propriétés du programme.
    Comme l'ensemble des méthodes sont communes aux deux classes j'ai delegué l'appel de ces méthodes pour pouvoir passer par une interface qui serait implémenté par ces deux classes.
    Mon problème c'est que je n'arrive pas à obtenir la classe qui doit être appelée puisque je ne peux pas instancié d'objet de type MaClasse ou AutreClasse...

    Actuellement j'ai une conditionnelle à chaque appel de maMethode() ou autreMethode() pour effectuer ce que je veux mais ce n'est pas très propre.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if(maPropriete){
        MaClasse.maMethode();}
    else{
        AutreClasse.maMethode();}
    J'ai cherché sans succès jusqu'ici c'est pourquoi je m'adresse à vous en espérant que vous pourrez m'indiquer une piste pour la mise en oeuvre (il doit bien y'avoir un pattern pour ce genre de cas).
    Merci!

  2. #2
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Salut,
    en static je crois que tu n'auras pas d'autre choix que de passer par java.lang.reflect ce qui a priori ne sera pas beaucoup mieux que ton test à chaque appel. C'est du "bidouillage" et si tu le peux je pense tu ferais mieux d'instancier tes classes.
    Est-ce que ta propriété est censée changer au cours du programme ou bien est-elle définie uniquement au lancement de l'appli ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Par défaut
    Non la propriété ne change pas au cours de l’exécution c'est pour ça que je me disais qu'il y'avait peut-être une possibilité pour faire ça plus proprement.
    Je vais regarder du coté de reflect, merci pour l'info

  4. #4
    Membre Expert Avatar de Djakisback
    Profil pro
    Inscrit en
    Février 2005
    Messages
    2 023
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 2 023
    Par défaut
    Après re-réflexion, je te conseillerais plutôt de rester sur ton test (si tu ne peux vraiment pas instancier ta classe). A la base je pensais à une espèce de wrapper de ce type :

    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
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    public class WrapClass {
     
    	Method m;
     
    	public WrapClass(boolean prop)	{
    		try {
    			if(prop)	{
    				this.m = Class1.class.getMethod("method"); 
    			}
    			else	{
    				this.m = Class2.class.getMethod("method");
    			}
    		}
    		catch (SecurityException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (NoSuchMethodException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
     
    	void method()	{
    		try {
    			m.invoke(null);
    		}
    		catch (IllegalArgumentException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (IllegalAccessException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    		catch (InvocationTargetException e) {
    			// TODO Auto-generated catch block
    			e.printStackTrace();
    		}
    	}
    }
    mais :
    1) tu te retrouves avec des instances de Method en mémoire et des galères pour récupérer les sorties ou passer les paramètres
    2) je crois que invoke() dans le cas d'une méthode statique instancie la classe de toute façon (à chaque appel ?)

    Le mieux serait sans doute de rester sur ton test mais avec un wrapper du type :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public class WrapClass {
     
    	public static void method()	{
    		if(prop) {
    			Class1.method();
    		}
    		else {
    			Class2.method();
    		};
    	}
    }
    qui te permet de définir le test une seule fois et ne pas le refaire dans toute l'appli.

  5. #5
    Membre Expert Avatar de Uther
    Homme Profil pro
    Tourneur Fraiseur
    Inscrit en
    Avril 2002
    Messages
    4 746
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pyrénées Orientales (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Tourneur Fraiseur

    Informations forums :
    Inscription : Avril 2002
    Messages : 4 746
    Par défaut
    Le polymorphisme ne s’appliquant pas aux méthodes statique, une interface commune ne peut pas fonctionner en l'état.

    Ne peux tu pas envisager d'utiliser des singletons à la place de classes avec des méthodes statiques? Tu pourrais ainsi utiliser une interface commune.

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Par défaut
    Je ne peux pas instancier ces classes (ni plusieurs ni une seule instance...)
    Je m'oriente donc vers ce que me propose Djakisback et sa WrapClass.
    Ce problème semble donc être résolu, merci

  7. #7
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Bonjour,

    C'est très inefficace comme design sachant qu'à chaque appel tu vas faire un test sur une propriété qui ne change pas de tout le programme.

    Déjà pourquoi ne pas pouvoir passer sur des méthodes d'instances plutôt que statiques, il y a une raison ou c'est simplement pour ne pas changer l'existant ?

    Un singleton qui instancierait la bonne classe une bonne fois pour toute au premier appel de getInstance() serait beaucoup plus efficace et propre en plus.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Par défaut
    Je suis bien d'accord ce n'est pas très efficient mais effectivement j'ajoute une fonctionnalité au programme et je ne veux pas perturber l'existant.
    A l'origine je comptais initialiser quelque part une variable static dans un tableau de taille 1 par exemple (ou autre...) puis récupérer cette variable stockée dans la première case de mon tableau pour appeler la bonne méthode mais je n'ai pas réussi.

    Au final je comptais pouvoir faire un getMonImpl().maMethode();

  9. #9
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    getMonImpl(), c'est le symptome même du singleton, quite a faire un singleton pour une partie seulement de la classe.

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2010
    Messages
    31
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 31
    Par défaut
    J'ai finalement modifié la semaine dernière (ce que je ne voulais pas faire au début) mais c'est tout de même plus propre.
    J'ai rédigé une interface et deux implémentations. Une unique instance de l'une ou de l'autre selon mon paramètre est créée lors de l'initialisation et stocké dans un tableau de taille 1 d'une autre classe qui possèdent les même méthodes en static. Dans chacune de ces méthodes je récupère l'implémentation stockés dans le tableau pour exécuter ce que je souhaite (suivant l'implémentation donc). Dans mon code cela reste transparent puisque je fait toujours appel aux méthodes de ma classe qui possède les méthodes statiques et redirige correctement leur exécutions.

  11. #11
    Expert éminent

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 202
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 202
    Par défaut
    Une petite question, pourquoi le tableau de taille 1? une variable simple le remplace avantageusement.

  12. #12
    Rédacteur
    Avatar de bulbo
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Février 2004
    Messages
    1 259
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Par défaut
    Désolé de ne répondre que trop tard

    Une implémentation élégante et vu ce qui est mis en œuvre tout aussi efficace je pense serait d'utiliser la classe Proxy.. vu que maintenant il y a une interface décrivant les méthodes.

    Bulbo
    [Java] [NetBeans] [CVS]
    La FAQ Java
    Merci de ne pas me poser de questions techniques par MP.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/07/2014, 23h40
  2. Réponses: 8
    Dernier message: 02/06/2008, 12h56
  3. Demander à une classe l'appel à une méthode
    Par sliderman dans le forum Langage
    Réponses: 3
    Dernier message: 22/01/2008, 15h45
  4. Réponses: 7
    Dernier message: 08/01/2005, 14h24
  5. String Grid et choix d'une couleur pour une ligne
    Par Gigottine dans le forum C++Builder
    Réponses: 12
    Dernier message: 17/05/2002, 16h23

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