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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 691
    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 691
    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 : 52
    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.

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 22/07/2014, 22h40
  2. Réponses: 8
    Dernier message: 02/06/2008, 11h56
  3. Demander à une classe l'appel à une méthode
    Par sliderman dans le forum Langage
    Réponses: 3
    Dernier message: 22/01/2008, 14h45
  4. Réponses: 7
    Dernier message: 08/01/2005, 13h24
  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, 15h23

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