2010-09-10 6 views
0

qui sont, pour chacun de la méthodologie suivante pour mettre en œuvre un auditeur d'interface, les avantages et les inconvénients:Avantages et inconvénients d'utiliser les auditeurs d'interface

1) dans la classe principale comme:

class MyClass implements ActionListener { 
    public void actionPerformed(ActionEvent e) { 
     // ... 
    } 

    component.addActionListener(this); 
} 

2) en tant que classe interne

class MyClass { 
    private class MyActionListener implements ActionListener { 
     public void actionPerformed(ActionEvent e) { 
      // ... 
     } 
    } 

    MyActionListener mal = new MyActionListener(); 
    component.addActionListener(mal); 
} 

3) comme une classe interne anonyme

class MyClass { 
    component.addActionListener(new ActionListener() { 
     public void actionPerformed(ActionEvent e) { 
      // ... 
     } 
    }); 
} 
+2

La plus grande différence est dans la première implémentation. Vous exposer l'actionPerformed au monde (puisque c'est directement sur votre classe publique) plutôt que de le cacher à l'intérieur par l'une des deux autres options que vous mentionnez.2) et 3) est purement un choix de style. –

+0

@Kirk: Pas de style * purement *, il y a un aspect de réutilisation, mais oui c'est proche. Spot sur autrement. –

Répondre

-1

Une classe interne anonyme (3) ne peut être utilisée que pour un composant et je l'utilise normalement pour déléguer à une méthode protégée de la classe externe sans le paramètre Event.

(1) et (2) permet de réutiliser l'instance de l'écouteur pour plusieurs composants, mais il faut ensuite découvrir via l'objet Event le composant source.

Donc, c'est à la tâche de choisir entre (1)/(2) ou (3).

Greetz, Ghad

+0

Non-sens. [caractères] –

+0

Merci Tom Hawtin pour l'explication détaillée. Ce fut un plaisir d'apprendre de votre sagesse – GHad

0

Si votre classe principale n'a pas une raison pour exposer ActionListener fonctionnalité en dehors lui-même, il est un détail de mise en œuvre et vous ne voulez pas aller aveC# 1. # 1 vous verrouille dans la fourniture de cette interface.

Vous verrez beaucoup de # 3, mais j'ai jamais été un fan. Si vous faites cela, vous ne pouvez pas réutiliser cette implémentation ActionListener ailleurs. Pour cette raison, j'irais soit aveC# 2 ou avec celui que vous n'avez pas mentionné, ce qui fait une classe au niveau du paquet qui fait l'implémentation (ce qui vous permet de le réutiliser ailleurs).

1

L'implémentation d'interfaces de rappel à des classes existantes est un mal absolu. Évidemment. Ne fais pas ça. Déjà.

Les classes internes non locales sont un peu du côté inutile. Vous pouvez les utiliser avec l'héritage, ils peuvent avoir plusieurs constructeurs, ils ont un nom, etc. Si vous avez ce genre d'exigences, alors vous devriez vraiment chercher de nouvelles classes externes.

Les classes internes anonymes sont relativement concis. Ils suppriment le besoin d'ajouter des champs et des constructeurs pour copier les champs. La tentation que ressentent certaines personnes de faire disparaître les champs de variables locales dans la classe "main". Vous pouvez simplement créer des variables locales à partir de la méthode englobante final. La «réutilisation» peut être réalisée grâce à la programmation standard de la tourbière, sans devoir recourir à d'autres classes nommées.

0

En plus des problèmes d'interface et de réutilisation mentionnés par d'autres, tenez compte de la lisibilité. Le troisième peut réduire la lisibilité si l'implémentation de actionPerformed() est longue.

De plus, # 2 permet à votre classe interne d'avoir un constructeur avec des arguments, et d'inclure des champs, si ceux-ci ne sont pas déjà disponibles dans la classe de premier niveau.

Questions connexes