2010-04-21 10 views
8

Soy nuevo en Java, así que tengan paciencia si esta es una pregunta ridículamente simple, pero tengo curiosidad acerca de esta llamada al método que tiene {code} presente; vea el siguiente código para ver un ejemplo en el método addSelectionListener. ¿Cuál es el propósito de esto? He estado buscando en los documentos una explicación, pero no puedo encontrar lo que se llama esta práctica, no importa ninguna información útil.¿Qué hace esa construcción de 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; 
     } 
    }); 

Gracias por cualquier ayuda o puntos de vista que se puede ofrecer

+4

¡Las clases anónimas vuelven a atacar! Realmente no puedo culpar a las personas por no poder encontrar una referencia para algo que no conocen el nombre de ... –

+5

"Soy nuevo en Java tan desnudo conmigo ..." - Apuesto a que dices eso a todos los chicos :-) –

+0

Tuve problemas con estos cuando comencé a aprender Java también :) – Skurmedel

Respuesta

2

No hay una llamada al método de hecho ... Este código establece un oyente de selección en el componente setStatusLine.

Un equivalente de este código podría ser

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

El addSelectionListener método recibe una instancia SelectionListener. No recibe "código". Lo confuso es el uso del nuevo nombre de clase/interfaz <>() {...}. Esta construcción se usa para anonymous inner classes. De hecho, lo que hace el código anterior es extender la clase SelectionAdapter, anulando su método widgetSelected, creando una instancia de la nueva clase y pasándola a addSelectionListener().

El uso de clases internas anónimas es común entre los oyentes, donde creamos una nueva clase, para usar en un lugar específico. Por lo tanto, no le damos un nombre, y preferimos implementarlo directamente en el contexto en el que se usa.

4

Como los otros colaboradores ya se ha dicho: Es una clase anónima

Se podría haber creado una nueva clase llamada MiClase en un nuevo archivo llamado McClass.java con ese aspecto:

class MyClass extends SelectionAdapter { 

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

} 

A continuación, podría haber cambiado la primera línea así:

setStatusLine.addSelectionListener (new MyClass());

Ver? Ahora tienes una clase "explícita" con solo una función. A menudo, eso es demasiado sobrecargado y complicaría su diseño.

¿Eso ayuda?

0

Me tomó algo de tiempo entender las clases anónimas internas. Las cosas básicas para recordar son:

Son como parámetros, excepto que en lugar de pasar una primitiva u Objeto que pasa en una clase que implementa una Interfaz/extiende una clase (sí, también funcionan con interfaces) según el método parámetro. Son anónimos, por lo que "desaparecen" justo después de que el método se haya salido de la pila. }); es un regalo mortal para una clase interna anónima. Suelen aparecer en las interfaces de usuario para eventos de escucha Ahorran desorden en el código, pero también dificultan la lectura.

Para leer el castigo completo JLS: http://java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.9.5

Si está interesado en conocer todos los detalles prácticos tales cosas, la lectura del libro SCJP y hacer el examen es bueno o puede estudiar la JLS. No le enseñará cómo codificar, pero le ayudará a comprender cómo funcionan Java y, de algún modo, muchos otros lenguajes de OO.