Saltar al contenido principal

Clases anónimas

Una clase anónima en Java es una clase sin nombre que se define e instancia al mismo tiempo.

Una clase anónima en Java es una subclase sin nombre que se crea al mismo tiempo que se instancia. Por lo tanto, siempre tiene una clase base o una interfaz de la que parte.

class Animal {
public void hacerSonido() {
System.out.println("Sonido genérico de animal");
}
}

public class EjemploClaseAnonima2 {
public static void main(String[] args) {
// Creamos una instancia de Animal, pero con una clase anónima
Animal gato = new Animal() {
@Override
public void hacerSonido() {
System.out.println("Miau");
}
};

gato.hacerSonido(); // Muestra: Miau
}
}

¿Cuándo usar clases anónimas?

Las clases anónimas son especialmente útiles cuando el comportamiento que implementan no se va a reutilizar en otros lugares del programa, es decir, cuando sólo será utilizada una vez. Si necesitas reutilizar el comportamiento en varias partes del programa, sería mejor crear una clase normal.

Estas clases anónimas permiten escribir código más compacto cuando no necesitas crear una nueva clase por separado. Además permiten implementar interfaces o clases abstractas de forma rápida y local, especialmente cuando solo se necesitan para una funcionalidad específica.

Características

Las características de una clase anónima:

  • No tiene nombre: La clase no recibe un nombre, por eso se denomina "anónima".
  • Instanciación al mismo tiempo: La clase es definida e instanciada al mismo tiempo.
  • Uso limitado: Normalmente se usa cuando solo se requiere la implementación de una interfaz o la subclase de un tipo específico, sin necesidad de crear una clase completa.
  • Accede al contexto de donde se crea: Puede acceder a variables locales o parámetros de métodos si están declaradas como final.

Ordenar arrays con clases anónimas

Por ejemplo, podemos implementar la clase de comparación dentro de la propia llamada al método sort() como si fuera una clase anónima:

Persona[] personas = new Persona[3];
personas[0] = new Persona(2, "Ana", 19);
personas[1] = new Persona(5, "Xurxo", 12);
personas[2] = new Persona(1, "Xoán", 10);

Arrays.sort(personas, new Comparator<Persona>() {
public int compare(Persona p1, Persona p2) {
return p1.getEdad() - p2.getEdad();
}
});

for (Persona persona : personas) {
System.out.println(persona.toString());
}

Ordenar colecciones con clases anónimas

Para ordenar listas u otras colecciones debemos utilizar el método estático sort() pero de la clase Collections.

ArrayList<Persona> personas = new ArrayList<Persona>();
personas.add(new Persona(2, "Ana", 19));
personas.add(new Persona(5, "Xurxo", 12));
personas.add(new Persona(1, "Xoán", 10));

Collections.sort(personas, new Comparator<Persona>() {
public int compare(Persona p1, Persona p2) {
return p1.getEdad() - p2.getEdad();
}
});

for(Persona persona: personas) {
System.out.println(persona.toString());
}