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 :

Réfléxion et initialisation de variable static


Sujet :

Langage Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut Réfléxion et initialisation de variable static
    Bonjours !
    Voilà, je souhaite créer un mini-framework mvc2 pour mes besoins personnelle pour le moment, mais je bloque sur un truc bizarre.

    Voire la fin si ca vous dit pas de lire la marre ci-dessous

    Le mvc2 regroupe tous les contrôleurs d'une vue dans une classe.
    Un contrôleur est donc une classe qui référence la vue et définit un ensemble de classes écouteur, que j'appellerai des actions.
    J'ai donc une structure du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    public class FormController extends AViewController{
     
        public IView view;
     
        public FormController(IView view) {
            this.view = view;
        }
     
        public class SubmitAction implements ActionListener{}
     
        public class ResetAction implements ActionListener{}
     
    }
    Jusque ici pas de problème !!

    Maintenant je voudrais pouvoir faire dériver les contrôleurs les uns des autres tous en gardant une liaison dynamique des classes interne.
    Ceux-ci étant impossible en java à cause de problême de cast entre la classes interne et englobante (merci tchize_ -> ici)
    J'utilise donc la réflexion pour instancier mes actions.

    Jusque là tjrs pas de problème !!

    Pour optimiser le traitement d'instanciation, j'ai créer une variable static , un hashmap , dans le quel je place le nom de l'action comme clé, et le constructeur par défaut , comme valeur.
    Ne connaissant pas les actions définit par le contrôleur depuis un context static, j'attends la première instanciation de mon contrôleur pour initialiser mon hashmap.

    Et là ca bloque
    Voici le code de ma classe contrôleur de base :
    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
     
    public class UID_AViewController {
     
        private static HashMap<String, Constructor> constructors;
     
        public mvc2.view.UID_IView view;
     
        public UID_AViewController(mvc2.view.UID_IView view) {
            if(constructors == null)
                constructors = initBridgelisteners();
            this.view = view;
        }
     
        public Object getAction(String string){
            try {
                return  (Object) constructors.get(string + "Action").newInstance(this);
            } catch (Exception ex) {
                Logger.getLogger(UID_AViewController.class.getName()).log(Level.SEVERE, null, ex);
            }
            return null;
        }
     
        public HashMap<String, Constructor> initBridgelisteners() {
     
            return new HashMap<String, Constructor>(){{
                Class<?>[] classes = UID_AViewController.this.getClass().getClasses();
     
                for(int i = 0; i < classes.length; i++){
                    System.out.println(classes[i].getSimpleName()+"--");
                    if(!classes[i].isInterface())
                        put(classes[i].getSimpleName(), classes[i].getConstructors()[0]);
                }
            }};
        }
    }
    Quand j'exécute la fonction initBridgelisteners sans l'assigner en retour à ma variable , ou que j'enlève le contexte static de ma variable, je retrouve toutes les classes interne définit.
    Mais dès que je l'assigne à ma variable static , plouf, il trouve plus rien

    Donc voilà, je sais pas d'où ca peux venir, et j'aurais bien voulue une explication sur ce bug si ca en est un ???
    Si quelqu'un à une idée ...

  2. #2
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 582
    Par défaut
    Je suis persuadé que tout ce chantier est totalement inutile et qu'il suffit de faire les choses simplement. Mais comme je ne comprends pas ce que tu cherches à faire, passons.

    Je n'ai pas le problème que tu décris à la fin. Pourrais-tu nous donner un exemple de programme court, avec un public static void main, qui a ce problème ?
    N'oubliez pas de consulter les FAQ Java et les cours et tutoriels Java

  3. #3
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Salut,


    D'accord avec thelvin : j'ai du mal à saisir l'objectif de tout cela et le problème...


    Par contre je trouve le code de la méthode initBridgelisteners() assez affreux : passer par une classe anonyme uniquement pour initialiser une Map

    a++

  4. #4
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut
    merci a vous deux pour votre réponse !!

    J'ai trouvé, y'a un gros probleme de conception dans ma classse...
    En gros la variable static référençant les constructeurs des classes interne peux pas être initialiser comme ca, sinon lors de dérivation, je retrouverais pas mes actions ...
    Mais pourquoi c'est toujours moi qui bug et pas java

    Sinon thelvin, je cherches a automatiser l'affectation des listener et + via des conventions de nommage.
    Par exemple dans mes vue , j'instancie les contrôleurs automatiquement en remplaçant le nom de package vue, par controller ...
    Et maintenant je voudrais créer une fonction qui recherche tout les composant typer par une interface, et possédant obligatoirement un nom. Et appliquer les listeners qu'il faut en fonctions des nom des classe...
    genre j'ai un composant nommé submit , alors dans mon controlleur je recherche toutes les listener qui commence par submit, et ensuite en fonction du suffix (Action, MouseWeel ect...), je lie l'événement au composant.

    adiGuba
    Je suis débutant en java et autodidacte ca aide pas
    Mais j'aime bien cette syntaxe elle évite de référencer trop de variable, et est plus rapide à l'exécution (enfin d'après mes testes très basique) ...

    je check résolue
    bye

  5. #5
    Expert éminent
    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
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kimjoa Voir le message
    Mais j'aime bien cette syntaxe elle évite de référencer trop de variable,
    Les variables locales ne posent aucun problème !

    Citation Envoyé par kimjoa Voir le message
    et est plus rapide à l'exécution (enfin d'après mes testes très basique) ...
    La seule différence que je vois, c'est que tu crées une classe en plus pour rien.
    Je ne vois pas en quoi ce serait plus rapide


    a++

  6. #6
    Membre éclairé
    Profil pro
    Inscrit en
    Février 2009
    Messages
    354
    Détails du profil
    Informations personnelles :
    Localisation : France, Sarthe (Pays de la Loire)

    Informations forums :
    Inscription : Février 2009
    Messages : 354
    Par défaut
    La seule différence que je vois, c'est que tu crées une classe en plus pour rien.
    Je ne vois pas en quoi ce serait plus rapide
    J'ai refait mes petits testes, et en faite t'as raison

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 05/08/2010, 11h05
  2. [Multithreading] Initialisation de variables local static en multithread
    Par vandamme dans le forum Threads & Processus
    Réponses: 2
    Dernier message: 11/11/2008, 12h40
  3. Initialiser une variable static
    Par mamelouk dans le forum Débuter
    Réponses: 15
    Dernier message: 31/07/2008, 17h48
  4. [debutant] initialisation variable static
    Par julien.63 dans le forum Langage
    Réponses: 3
    Dernier message: 12/01/2008, 18h02
  5. [VB6]Initialiser une variable Static dans un évenement
    Par loverdose dans le forum VB 6 et antérieur
    Réponses: 16
    Dernier message: 20/01/2005, 14h57

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