2010-04-21 5 views
8

Je ne sais pas trop java si c'est une question ridiculement simple mais je suis curieux de savoir comment appeler {code} - voir le code ci-dessous pour un exemple dans la méthode addSelectionListener. Quel est le but de ceci? J'ai regardé à travers des documents pour une explication, mais je ne peux pas sembler trouver ce que cette pratique est appelée, peu importe toute information utile.Que fait cette construction Java?

setStatusLine.addSelectionListener(new SelectionAdapter() { 
     public void widgetSelected(SelectionEvent e) { 

      String message = "I would like to say hello to you."; 
      if (pressed) { 
       message = "Thank you for using me"; 
      } 
      setStatusLine(message); 
      pressed = !pressed; 
     } 
    }); 

Merci pour toute aide ou des idées qui peuvent être offerts

+4

Les classes anonymes frappent à nouveau! On ne peut pas vraiment blâmer les gens de ne pas être capable de trouver une référence pour quelque chose dont ils ne connaissent pas le nom ... –

+5

"Je suis nouveau à java si nue avec moi ..." - Je parie que tu dis ça à tous les gars :-) –

+0

J'ai lutté avec ceux-ci quand j'ai commencé à apprendre Java aussi bien :) – Skurmedel

Répondre

2

Il n'y a pas d'appel de méthode en fait ... Ce code définit un écouteur de sélection sur le composant setStatusLine.

Un équivalent de ce code pourrait être

public class X implements SelectionListener{ 

    //In the constructor or an other method. 
    setStatusLine.addSelectionListener(this); 

    public void widgetSelected(SelectionEvent e) { 

     String message = "I would like to say hello to you."; 
     if (pressed) { 
      message = "Thank you for using me"; 
     } 
     setStatusLine(message); 
     pressed = !pressed; 
    } 

} 
3

Le procédé addSelectionListener reçoit une instance de SelectionListener. Il ne reçoit pas de "code". Ce qui prête à confusion, c'est l'utilisation du nouveau nom de classe/interface <>() {...}. Cette construction est utilisée pour anonymous inner classes. En fait, le code ci-dessus étend la classe SelectionAdapter, en remplaçant sa méthode widgetSelected, en créant une instance de la nouvelle classe et en la passant à addSelectionListener().

L'utilisation de classes internes anonymes est courante avec les écouteurs, où nous créons une nouvelle classe, à utiliser dans un endroit spécifique. Par conséquent, nous ne lui donnons pas de nom, et nous préférons l'implémenter directement dans le contexte où il est utilisé.

4

Comme les autres contributeurs déjà dit: Il est une classe anonyme

Vous auriez pu créer une nouvelle classe nommée MyClass dans un nouveau fichier appelé McClass.java regarder comme ça:

class MyClass extends SelectionAdapter { 

    public void widgetSelected(SelectionEvent e) { 
    <your code that's being executed whenever the widget is being selected> 
    } 

} 

Ensuite, vous aurait pu changer la première ligne comme ça:

setStatusLine.addSelectionListener (new MyClass());

Voir? Vous avez maintenant une classe "explicite" avec une seule fonction. Souvent, c'est trop de frais généraux et encombrerait votre conception.

Cela aide-t-il?

0

Il m'a fallu du temps pour comprendre les cours d'Anonymous Inner. Les choses de base à retenir sont:

Ils sont juste comme des paramètres, sauf au lieu de passer dans une primitive ou un objet que vous passez dans une classe qui implémente une interface/étend une classe (oui, ils fonctionnent aussi avec des interfaces) selon la méthode paramètre. Ils sont anonymes, donc "disparaissent" juste après que la méthode ait sauté de la pile. }); est un cadeau mort pour une classe interne anonyme. Ils apparaissent souvent dans les interfaces utilisateur pour les événements de l'écouteur. Ils économisent de l'encombrement dans votre code, mais rendent également la lecture plus difficile.

Pour la peine Lect JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

Si vous êtes intéressé à connaître le Nitty Gritty de telles choses, en lisant le livre SCJP et de faire l'examen est bon ou vous pouvez étudier la JLS. Il ne vous apprendra pas à coder, mais il vous aidera à comprendre comment Java, et d'une certaine manière, de nombreux autres langages OO fonctionnent.