Ir al contenido principal

Clases anónimas JAVA (Anonymous Classes)


Código fuente articulo:
https://www.dropbox.com/s/pzw44ot0ji2metl/Lambda.zip?dl=0

Las Clases anónimas en JAVA son una solución rápida para implementar una clase que se va utilizar una vez y de forma inmediata. Por ejemplo el EventHandler para un botón se puede implementar en la misma asignación valiendonos de la interfaz EventHandler que ya esta definida. Pero mejor vamos con un ejemplo mas simple.

De la definición anterior concluimos dos cosas la primera es que para crear una clase anónima es necesario haber definido una interfaz, una clase o una clase abstracta. La clase anónima lo que hará sera implementar la interfaz definida o sobre escribir los métodos definidos. Para ilustrar esto utilizaremos el ejemplo del JAVA Tutorial https://docs.oracle.com/javase/tutorial/java/javaOO/anonymousclasses.html.

en este ejemplo tenemos que implementar clases que cumpliendo con la interfaz Saludo sean capaces de saludar en diferentes idiomas. El paso uno sera definir la interfaz con la que vamos a trabajar:

interface Saludo<Object> {
        public void saluda();
        public void saludaAAlguien(String aguien);
    }   

Sera la interfaz saludo que tiene dos métodos. Ahora para ilustrar el método clásico la implementaremos utilizando una inner class para hacer el saludo en ingles, la inner class se ve exactamente como una clase normal de JAVA y como ventaja no necesita una interfaz predefinida para existir. La inner class se vera así

class SaludaEnIngles implements Saludo {
            String name = "world";
            public void saluda() {
            saludaAAlguien("world");
            }
            public void saludaAAlguien(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }

como cualquier clase mundana.

Ahora si implementaremos otros dos saludos usando inner classes uno en francés y otro en español. 

El saludo en francés se vera así

Saludo frenchGreeting = new Saludo() {
        String name = "tout le monde";
        public void saluda() {
        saludaAAlguien("tout le monde");
        }
        public void saludaAAlguien(String someone) {
            name = someone;
            System.out.println("Salut " + name);
        }
    };

como puedes ver no existe un nombre para la clase utiliza el mismo nombre de la interfaz. La formula de la clase anónima va así;

El tipo de dato de cualquier superclase o interfaz que vamos a implementar o a extender, 
Saludo

el nombre de una variable que va a almacenar nuestra impelementación 
frenchGreeting

una asignación
=
un 
NEW

el nombre de la interfaz a implementar o la clase a extender como un constructor sin argumentos 
Saludo()
y dos corchetes que contendrán la impelementación
{};

El saludo en español se vera así

 Saludo spanishGreeting = new Saludo() {
            String nombre= "mundo";
            public void saluda() {
            saludaAAlguien("mundo");
            }
            public void saludaAAlguien(String alguien) {
                nombre= alguien;
                System.out.println("Hola, " + nombre);
            }
        };

Esta seria la clase finalizada, como veras una clase anónima se puede definir dentro de un método como en el caso del saludo en español o fuera del método como en el caso del saludo en francés.

public class SaludoAnonimo {

interface Saludo<Object> {
        public void saluda();
        public void saludaAAlguien(String aguien);
    }
public void diHola(){
class SaludaEnIngles implements Saludo {
            String name = "world";
            public void saluda() {
            saludaAAlguien("world");
            }
            public void saludaAAlguien(String someone) {
                name = someone;
                System.out.println("Hello " + name);
            }
        }
      
Saludo englishGreeting = new SaludaEnIngles();
       
        Saludo spanishGreeting = new Saludo() {
            String nombre = "mundo";
            public void saluda() {
            saludaAAlguien("mundo");
            }
            public void saludaAAlguien(String alguien) {
                nombre = alguien;
                System.out.println("Hola, " + nombre);
            }
        };   
        englishGreeting.saluda();
        frenchGreeting.saludaAAlguien("Fred");
        spanishGreeting.saluda();
}
 
Saludo frenchGreeting = new Saludo() {
       String nombre = "tout le monde";
       public void saluda() {
        saludaAAlguien("tout le monde");
       }
       public void saludaAAlguien(String alguien) {
           nombre = alguien;
           System.out.println("Salut " + nombre);
       }
   };
public static void main(String... args) {
            new SaludoAnonimo().diHola();
    }    
}

Otros ejemplos de clase anónima serian; una clase anónima que extiende de una clase normal

class Extiende{
public void metodo(){
System.out.println("Soy metodo padre");
}
}
Extiende extiende= new Extiende(){
public void metodo(){
System.out.println("Soy metodo hijo");
public void nuevo(){
System.out.println("Soy metodo nuevo");
}
};

Una clase anonima que implementa una interfaz pero que se almacena en una super interfaz 

interface InterfasePadre{
public void metodoSuper();
}
interface InterfaseHija extends InterfasePadre{
public void metodoHija();
}
InterfasePadre claseImplementa= new InterfaseHija(){

@Override
public void metodoSuper() {
// TODO Auto-generated method stub
}

@Override
public void metodoHija() {
// TODO Auto-generated method stub
}
}; 

Como puedes ver tienen mucho para experimentar con esto de las clases anónimas. ¿Que pasa si la clase que estas extendiendo no tiene un constructor vació?, ¿que pasa si defino una clase anónima fuera de una clase? ... ¿que otros casos se te ocurren?. Escribe en los comentarios.

Comentarios

  1. Esta buena la info pero que el codigo este en verde fluor complica mucho la lectura de ello, te recomendaria no tenerla de ese color

    ResponderEliminar

Publicar un comentario