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 :

Classe anonyme et classe interne


Sujet :

Langage Java

  1. #1
    Débutant Avatar de amazircool
    Inscrit en
    Décembre 2005
    Messages
    497
    Détails du profil
    Informations forums :
    Inscription : Décembre 2005
    Messages : 497
    Points : 152
    Points
    152
    Par défaut Classe anonyme et classe interne
    Salut, je ne sais pas exactement quel l’utilité de utiliser une classe Interne ?
    Et même une classe Anonyme?
    merci.

  2. #2
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Salut,

    Une classe interne (ou classe privée) te permet, dans le cas d'une interface graphique, de définir les réactions de tes évènements différemment pour chaque action.
    Exemple : Deux boutons bouton1 et bouton2.
    Tu veux bien évidemment définir 2 actions différentes pour ces deux boutons.
    Tu ne peux donc pas pour les deux faire addActionListener(this) et implémenter ActionListener sur ta classe principalea lors tu crées 2 classes privées qui implémentent ActionListener et redéfinissent actionPerformed ce qui te permet de définir deux comportements différents pour ces deux boutons. Ce n'est qu'un exemple d'utilisation d'une classe privée, il doit y en avoir d'autres.

    Pour ce qui est de la classe anonyme, elle te permet de définir une instance d'une classe sans pour autant la référencer. Il est possible dans une classe anonyme de redéfinir des méthodes. Exemple pour un Thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    	new Thread
    		(
    			new Runnable() 
    			{
    				public void run() 
    				{
    					//blabla
    				}
    			}
    		).start();
    Ici je redéfinis la fonction run() de Runnable et cela crée une nouvelle instance d'un Thread qui s'exécute suite à l'appel de start(). Tout ceci évite de créer une classe qui étendrait Thread juste pour créer un Thread ponctuel.

    Les classes anonymes peuvent être utilisé pour les évènements et l'exemple d'au dessus mais on finit par avoir un code très brouillon et dur à maintenir.

    Si quelqu'un sait expliquer clairement sans exemple, je suis preneur

    F.

  3. #3
    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 : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    En fait pour les évenement j'utilise des classes anonymes comme quoi

    Je fais ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    JButton but = new JButton("Click me");
    but.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent event)
      {
        doClickMe();
      }
    });
    C'est clair et facilement maintenable, le listener est crée à la création du bouton mais si je dois modifier le code associé je cherche direct la méthode doClickMe.

    Une classe privé est utile surtout quand on veut créer plusieurs instance de la dite classe spécialisée (contrairement aux listeners ou on en utilise qu'un), et surtout dans l'éventualité ou cette classe n'a aucun intérêt à être exposée aux autres classes.

    Par exemple si tu te définis un modèle de donnée interne à ta classe pour simplifier ton code mais que ce modèle est caché par l'implémentation et seulement utilisé en interne une classe privé est parfaite pour ça.

    Bulbo

  4. #4
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Personnellement j'ai pris le reflexe d'utiliser des classes internes pour les évènements pour la réutilisation du code : on a souvent plusieurs boutons qui font la même chose

    F.

  5. #5
    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 : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par mavina Voir le message
    Personnellement j'ai pris le reflexe d'utiliser des classes internes pour les évènements pour la réutilisation du code : on a souvent plusieurs boutons qui font la même chose

    F.
    Rien ne t'empêche de faire ainsi:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    ActionListener myButtonListener = new ActionListener() {
      public void actionPerformed(ActionEvent event)
      {
         doClickMe();
      }
    };
     
    JButton but1 = new JButton("Click me");
    but1.addActionListener(myButtonListener);
     
    JButton but2 = new JButton("Click me too");
    but2.addActionListener(myButtonListener);
    Si le code est le même pourquoi plusieurs instances ??

    Niveau réutilisation c'est mieux que ta solution, une seule implémentation doClickMe, une seule instance de listener myButtonListener, moins d'objet et une bonne visibilité du code du listener surtout si tu utilises un IDE.

    Bulbo

  6. #6
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Coucou,

    Je n'utilise pas d'IDE, je programme sous Emacs (on ne peut pas appeller ça un IDE java si ? )

    Moi je fais ainsi :

    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
     
    monBouton.addActionListener(new ActionDeMonBouton(/*parametres utiles*/));
     
    //...
     
    private class ActionDeMonBouton implements ActionListener
    {
         // attributs de classe
          ActionDeMonBouton(/*parametres utiles*/)
          {
          }
          public void actionPerformed(ActionEvent e)
          {
                 // Le code avec les parametres utiles tout ca tout ca
          }
    }

    l'avantage de cette méthode est que tu passes à ta classe privée ce que tu veux pour des traitements divers et variés dans le actionPerformed, alors que dans ta classe anonyme, tu ne peux manipuler les attributs de this si ils ne sont pas static... Si ?

    F.

  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 : 51
    Localisation : France

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Février 2004
    Messages : 1 259
    Points : 1 937
    Points
    1 937
    Par défaut
    Citation Envoyé par mavina Voir le message
    Coucou,

    Je n'utilise pas d'IDE, je programme sous Emacs (on ne peut pas appeller ça un IDE java si ? )

    Moi je fais ainsi :

    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
     
    monBouton.addActionListener(new ActionDeMonBouton(/*parametres utiles*/));
     
    //...
     
    private class ActionDeMonBouton implements ActionListener
    {
         // attributs de classe
          ActionDeMonBouton(/*parametres utiles*/)
          {
          }
          public void actionPerformed(ActionEvent e)
          {
                 // Le code avec les parametres utiles tout ca tout ca
          }
    }

    l'avantage de cette méthode est que tu passes à ta classe privée ce que tu veux pour des traitements divers et variés dans le actionPerformed, alors que dans ta classe anonyme, tu ne peux manipuler les attributs de this si ils ne sont pas static... Si ?

    F.
    Ma classe anonyme appelle une méthode private de this, cette méthode à accès à tout dans this comme n'importe quelle méthode.

    Enfin on va pas trop dérivé de la question originale non plus

    Bulbo

  8. #8
    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,

    Citation Envoyé par mavina Voir le message
    alors que dans ta classe anonyme, tu ne peux manipuler les attributs de this si ils ne sont pas static... Si ?
    Une classe anonyme est en fait une classe interne privé, et les deux permettent donc la même chose.

    La seule différence vient du fait qu'on ne peut instancier une classe anonyme via son nom (puisqu'on ne le connait pas).

    Après c'est surtout une question d'organisation...


    Quels sont les différents types de classes internes (nested classes) ?

    a++

  9. #9
    Membre émérite
    Avatar de mavina
    Homme Profil pro
    Développeur Java
    Inscrit en
    Octobre 2004
    Messages
    1 812
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : Chine

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2004
    Messages : 1 812
    Points : 2 411
    Points
    2 411
    Par défaut
    Oui, je disais ca dans le sens où la classe privée permettait un passage de paramètre dans le constructeur

    F.

Discussions similaires

  1. class pour table + class pour td = class td non fonctionnelle ?
    Par supergrey dans le forum Mise en page CSS
    Réponses: 2
    Dernier message: 28/05/2009, 08h13
  2. [Info]Classe anonyme - interne
    Par thibaut dans le forum Langage
    Réponses: 8
    Dernier message: 31/08/2006, 13h18
  3. [AS2] Atteindre attribut d'une classe depuis une fonction interne a la classe
    Par Demco dans le forum ActionScript 1 & ActionScript 2
    Réponses: 6
    Dernier message: 18/04/2006, 21h03
  4. Réponses: 5
    Dernier message: 16/08/2005, 10h30
  5. [classe anonyme] implementant une interface
    Par stanilas dans le forum Langage
    Réponses: 4
    Dernier message: 30/11/2004, 00h18

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