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. No se entiende nada, bro

    ResponderEliminar
  2. 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

Entradas populares de este blog

Conectarse al LDAP (directorio activo) utilizando JAVA

Un LDAP es un sistema de autenticación estándar utilizado por muchas compañías para controlar el acceso a aplicaciones y recursos. Por lo general se espera que cualquier nueva aplicación haga uso del LDAP para realizar la autenticación y controlar los permisos en forma unificada, la seguridad es transversal a todos los procesos que realiza una organización. Una vez regado el cuento a lo que vinimos, como conectarse a un LDAP. Lo primero que debes saber es que no se requieren librerías adicionales, JAVA en su distribución estandar ya cuenta con todo lo que necesitas. primero tres siglas que tienes que tener en cuanta. CN  = Common Name OU  = Organizational Unit DC  = Domain Component Para conectarse primero necesitas es instanciar un Objeto de la clase LdapContext, este se encargara de manejar la conexión al LDAP y las peticiones que se hagan al mismo. por consiguiente necesitara que le entregues una serie de propiedades de conexión. Esto lo haras con un Map de la siguiente

Paralelismo en JAVA Executors (ExecutorService, Callables y Futures).

Código fuente articulo: https://www.dropbox.com/s/jci67120hmd0uce/Paralelismo.zip?dl=0 Para manejo de concurrencia Java desde la versión 5 presento el Concurrency API  este presento una mejora substancial en el manejo de hilos y procesos en paralelo, antes solo contabas con Thread y Runnable. lo que te obligaba a controlar la creación y el numero de hilos de ejecución, no te entregaba un resultado del procesamiento y no te dejaba controlar las Excepciones que lanzara un hilo...un hilo se lanzaba y amenos que le enviaras un un CallBack perdías todo contacto con el. Para solucionar este problema se crearon dos tipos de objetos Callables y Futures. estos dos te permiten encapsular una tarea asignándole un tipo de Objeto que sera el valor de retorno y hacer seguimiento a las tareas que ejecuto en paralelo pudiendo preguntar si ya termino, que resultado lanzo y que excepciones ocurrieron. Arranquemos con la implementación de Callable, Callable es una interfaz que te permite defini