DEV Community

Elías Canales
Elías Canales

Posted on

Clases anidadas mejor estáticas

Para clases anidadas tenemos varios tipos, clases anidadas estaticas, clases miembro, clases locales y clases anónimas. Es importante conocer las opciones antes de decidir cuál encaja mejor y por qué.

Clases anidadas (nested classes)

Las clases anidadas son simplemente clases definidas dentro de otra clase, es algo que puede parecer raro pero tiene sentido en determinados casos. Por ejemplo, si quieres definir un Enum que solo pertenece a una clase, puedes definirlo internamente en una clase y acceder a él de la forma ClaseExterna.NombreEnum.Valor.

public class User {

    public enum Rol {
        SUPPLIER, CUSTOMER
    }

}

//La usariamos así
User.Rol.CUSTOMER
Enter fullscreen mode Exit fullscreen mode

Podemos hacer la clase pública o privada. En el caso de un enum, esto depende principalmente de si necesitamos usar la clase externamente o no.

Clases miembro (member classes)

Las clases miembro son iguales a las clases anidadas estáticas, pero con la única diferencia de que no son estáticas. Tienen una referencia a la clase que las contiene y son creadas teniendo una instancia de su contenedor.

public class User {

    class Rol {

    }

}

//Instanciación peculiar
User.Rol rol new User().new Rol();
Enter fullscreen mode Exit fullscreen mode

Clases locales (local classes)

Las clases locales son aquellas que se definen en un ambito local como un método. Tienen alcance solo donde son definidas. Es importante destacar que, si las definimos como no estáticas, pueden tener acceso a la instancia padre, mientras que si son estáticas, solo tendrán acceso a los atributos estáticos de la clase.

public void method() {
    class Rol {

    }

    final Rol rol = new Rol();
}
Enter fullscreen mode Exit fullscreen mode

Clases anonimas (anonymous classes)

Son las clases más limitadas y se han utilizado comúnmente como “función”, por ejemplo, si querías tener una clase Runnable sin necesidad de crear una clase que implementase dicha interfaz:

new Thread(
    //Clase anonima
    new Runnable() {
    @Override
    public void run() {

    }
})
Enter fullscreen mode Exit fullscreen mode

Pero con la entrada de las funciones lambda en Java 8, ahora podemos simplemente hacer:

new Thread(() -> {

})
Enter fullscreen mode Exit fullscreen mode

Es mucho más limpio y se entiende mejor al leer el código.

Clases anidadas estáticas (static nested classes)

Solo las clases anidadas pueden tener el modificador de comportamiento static, las clases normales no pueden. Si hacemos una clase miembro estática, tendremos una clase anidada estática.

Puede ser instanciada de una forma más simple y será prácticamente lo mismo, con la diferencia de que esta no tiene una referencia a una instancia que la envuelva, porque es independiente.
Normalmente, este tipo de clases no suelen requerir esa vinculación, y al hacerlas estáticas, estás mejorando el rendimiento y el funcionamiento del recolector de basura de Java.

Referencias
Joshua Bloch, Effective Java (3ª edición), Addison-Wesley, 2018.

Top comments (0)