Como muchas veces cada una de estas clases Listener serán solo para el uso y consumo de un componente en particular del sistema o aplicación que estemos construyendo, no tiene mucho sentido hacer clases completas y separadas.
Es por ello que tenemos las clases anónimas, con las cuales podemos acortar la definición de los Listener y así simplificar su puesta en marcha en nuestros programas.
Clases anónimas Listener
Como mencionamos al inicio, cuando construimos componentes del tipo Listener para manejar los eventos de los elementos de nuestras interfaces de usuario, generalmente estos tienen un propósito muy específico que no se pueden reutilizar, es por ello que podemos optar por generarlos como clases anidadas y con ello simplificar un poco el código a generar.
Veamos a continuación un par de ejemplos de cómo podemos implementar una clase anónima partiendo desde una clase anidada:
Vemos que en la primera parte definimos un método público y luego dentro de este hacemos una clase anidada, esta clase se encarga de implementar una Interface para poder implementar un Listener para los eventos que se puedan generar en el programa.
En la parte inferior hemos hecho lo mismo que al inicio, solo que en vez de definir una clase anidada estamos definiendo la clase anónima, con lo que podemos implementar la interfaz y hacer la instancia en un solo paso, reduciendo efectivamente de esta manera las líneas de código a ejecutar.
Consideraciones de las clases anónimas
- Una clase anónima es en realidad un tipo especial de clase anidada y será tratada como tal, sin embargo esta no puede hacer extends o implements de forma explícita.
- Una clase anónima debe siempre implementar los métodos abstractos de la súper clase o de la Interface.
- Las clases anónimas siempre van a utilizar la forma sin argumentos del constructor de la clase superior. En el caso que se implemente una interface el constructor será Object.
- Por cada clase anónima que se compile, Java va a generar un archivo .class, donde se identificará cada una por el orden en que se tomen, por ejemplo ClaseExterna$1class, ClaseExterna$2.class y así sucesivamente.