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

Java Discussion :

Instancier une classe interne depuis l'extérieur


Sujet :

Java

  1. #1
    Membre confirmé
    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
    Points : 491
    Points
    491
    Par défaut Instancier une classe interne depuis l'extérieur
    Bonjours !

    Voilà, dans mon exemple MVC, j'ai une classe controlleur qui initialise une vue et instancie des actions fournie par des getters.

    Avec du code on comprends mieux :
    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
     
    public class SaveBDActions {
     
        private final SaveBDForm panel;
        private final Submit submit;
        private final ChoosePath choosePath;
     
     
        public SaveBDActions(SaveBDForm panel) {
            this.panel = panel;
            choosePath = new ChoosePath();
            submit = new Submit();
        }
     
        public ChoosePath getChoosePath() {
            return choosePath;
        }
     
        public Submit getSubmit() {
            return submit;
        }
     
        public class Submit extends AbstractDialogSubmit{
            ....
        }
     
        public class ChoosePath  implements ActionListener{
            ...
        }
    }
    Le truc c'est que je voudrait non pas passer par des getters pour récupérer mais actions, mais les initialiser depuis extérieure, en l'occurrence dans ma vue. Le hic, c'est que si je fait un truc du genre:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SaveBDActions controlleurs = new SaveBDActions(this);
    path.addActionListener(new controlleurs.ChoosePath());
    ca me fait une erreur, car le point dans l'appel d'une classe équivaut délimiteur de package....

    Donc je voudrais savoir si il y a une méthode permettant d'instancié une classe interne depuis l'extérieure .....

  2. #2
    Expert éminent sénior
    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
    Points : 23 190
    Points
    23 190
    Billets dans le blog
    1
    Par défaut
    Salut,


    Les classes internes sont liées à une instance de la classe englobante, ce qui te permet d'utiliser directement les champs de l'instance. C'est pourquoi tu as besoin d'une instance de la classe englobante pour les créer.

    Si tu n'as pas besoin d'un tel lien, il faut déclarer la classe en static.

    Plus d'info : Quels sont les différents types de classes internes (nested classes) ?

    a++

  3. #3
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    En fait, pour les classes internes, il y a quand même une syntaxe pour les créer de l'extérieur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    controlleurs.new ChoosePath()
    Mais je ne la vois pas souvent et je conseille, en effet, de plutôt les faire fabriquer par leur classe contenante.

    Pour les classes imbriquées statiques, c'est plus naturel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    new SaveBDActions.ChoosePath()
    Nous noterons donc que ce n'est pas une question de nom de package.

  4. #4
    Membre confirmé
    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
    Points : 491
    Points
    491
    Par défaut
    Merci de ta réponse adiGuba

    En faite je crois que tu as pas compris ma question, je créé des classes d'actions interne à une classe contrôleur pour quels partage toutes une vue. Je sais qu'il faut que je créer d'abord la classe de base, mais une fois celle ci créer je voudrait instancier mes actions depuis extérieure , dans ma vue. comme ca :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SaveBDActions controlleurs = new SaveBDActions(this);
    path.addActionListener(new controlleurs.ChoosePath());
    Je crois pas que ce soit possible, mais mieux vos être sur

  5. #5
    Membre confirmé
    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
    Points : 491
    Points
    491
    Par défaut
    merci thelvin t'es trop fort

    tu ne préconises pas cette usage? Peux tu me dire pk?

    Nous noterons donc que ce n'est pas une question de nom de package.
    En effet, j'avais pensé aux appel statique ...

    a+

  6. #6
    Membre chevronné
    Inscrit en
    Août 2009
    Messages
    1 073
    Détails du profil
    Informations forums :
    Inscription : Août 2009
    Messages : 1 073
    Points : 1 806
    Points
    1 806
    Par défaut
    Citation Envoyé par kimjoa Voir le message
    merci thelvin t'es trop fort

    tu ne préconises pas cette usage? Peux tu me dire pk?
    Je me permet de répondre : parce que en général, une classe interne a une forte dépendance à la classe contenante. Il est donc beaucoup plus naturel d'avoir une méthode de la classe contenante qui te renvoie un nouvel objet. En outre, ça évite cette syntaxe qui n'est quand même pas tout à fait "naturelle" (preuve en est, tu ne la connaissais pas).

    Ce qui revient donc à faire une méthode dans ta classe :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    public Intern createNewIntern( /*parametres ce que tu veux */) {
       // Il devrait y avoir des choses ici, vu le couplage fort  
       return new Intern();
    }

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Septembre 2004
    Messages : 12 559
    Points : 21 619
    Points
    21 619
    Par défaut
    Citation Envoyé par kimjoa Voir le message
    tu ne préconises pas cette usage? Peux tu me dire pk?
    Parce que, comme tu as pu le constater, peu de gens le connaissent. Et ceux qui le connaissent n'ont pas l'habitude de le lire. En plus, ça a juste pas l'air naturel.

    Donc, si quelqu'un d'autre lit ton code, ou que tu le relis plus tard, tu vas arriver distraitement sur cette ligne, puis ton regard va se refocaliser dessus, et tu vas te dire "euh, minute, quoi ??!"

  8. #8
    Membre confirmé
    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
    Points : 491
    Points
    491
    Par défaut
    ok ! je suis débutant en java , c'est pour ca . Je vais suivre vos conseils, Rei Ichido et thelvin... merci à vous bye!

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

Discussions similaires

  1. [Débutant] Impossible d'instancier une classe depuis .aspx.vb
    Par Jah73 dans le forum ASP.NET
    Réponses: 1
    Dernier message: 08/01/2014, 09h22
  2. [PHP 5.2] [POO] Instancier une classe fille appelante depuis la classe mère
    Par loacast dans le forum Langage
    Réponses: 13
    Dernier message: 15/08/2010, 17h12
  3. Instanciation d'une classe fille depuis une classe mère
    Par khaled-benloucif dans le forum Langage
    Réponses: 2
    Dernier message: 30/01/2009, 23h59
  4. Réponses: 3
    Dernier message: 12/06/2008, 16h05
  5. Réponses: 1
    Dernier message: 10/09/2006, 23h24

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