Clases Anónimas

Clases anónimas

En este ejemplo Consumer es una interfaz, pero las interfaces no se pueden instanciar, lo que pasa es que se esta creando una clase anónima que implementa el método que tiene la interfaz.

La clase anónima está ahora en la variable consumer, como es una implementación de consumer y gracias al polimorfismo, se puede guardar.

        Consumer consumer = new Consumer() {
            @Override
            public void accept(Object o) {
                System.out.println(o);
            }
        };

En este otro ejemplo, no es una interfaz sino una clase normal, pero podemos crear una clase anónima que extienda de la clase instanciada, pudiendo así modificar el comportamiento de alguna de sus métodos.

        Random random = new Random() {
            @Override
            public long nextLong() {
                return super.nextLong();
            }

            @Override
            public double nextDouble() {
                return super.nextDouble();
            }
        };

Java se encarga de generar la clase que implementa dicha interfaz en tiempo de compilación.

Otro ejemplo aquí para verlo, solo funciona con los métodos públicos y protected, con los privados no.

class Persona{
    private String nombre = "Cristian";

    private String apellido = "Peter";

    private int edad = 27;

    public String getNombre() {
        return nombre;
    }

    protected String getApellido() {
        return apellido;
    }

    private int getEdad() {
        return edad;
    }

    @Override
    public String toString() {
        return "Persona{" +
                "nombre='" + nombre + '\'' +
                ", apellido='" + apellido + '\'' +
                ", edad=" + edad +
                '}';
    }
}

Aquí modificamos los getters, no devuelven los atributos de la clase Persona, sino unos datos hardcodeados. Aqui la clase anónima extiende de persona y implementa sus propios métodos.

    public static void main(String[] args) {
        Persona p = new Persona();
        System.out.println(p.getNombre());

        Persona p1 = new Persona(){
            @Override
            protected String getApellido() {
                return "Peterson";
            }

            @Override
            public String getNombre() {
                return "Cristi";
            }
        };
        System.out.println(p1.getNombre());
    }