Java Inner Classes
Las clases internas de Java son clases definidas dentro de otra clase. Se utilizan para agrupar lógicamente clases que sólo se utilizan en un lugar, aumentan la encapsulación y pueden dar lugar a un código más legible y mantenible. Las clases internas pueden acceder a los miembros (incluidos los miembros privados) de la clase externa.
Tipos de clases internas
- Clase anidada no estática (Clase interna): Asociado a una instancia de la clase externa.
- Clase estática anidada: No está asociado a una instancia de la clase externa y sólo puede acceder a los miembros estáticos de la clase externa.
- Clase interna local: Definido dentro de un bloque, normalmente un método.
- Clase interna anónima: Una clase sin nombre, utilizada para instanciar objetos con cierta funcionalidad "sobre la marcha".
Ejemplos
Ejemplo 1: Clase interna no estática
public class OuterClass {
private String message = "Hello from Outer Class";
class InnerClass {
void display() {
System.out.println(message);
}
}
public static void main(String[] args) {
OuterClass outer = new OuterClass();
OuterClass.InnerClass inner = outer.new InnerClass();
inner.display();
}
}
En este ejemplo, InnerClass
es una clase interna no estática. Puede acceder al campo message
de OuterClass
. Una instancia de InnerClass
se crea utilizando una instancia de OuterClass
.
Ejemplo 2: Clase estática anidada
public class OuterClass {
private static String message = "Hello from Static Nested Class";
static class StaticNestedClass {
void display() {
System.out.println(message);
}
}
public static void main(String[] args) {
OuterClass.StaticNestedClass nested = new OuterClass.StaticNestedClass();
nested.display();
}
}
Aquí, StaticNestedClass
es una clase estática anidada. Puede acceder directamente a los miembros estáticos de OuterClass
. No se necesita ninguna instancia de OuterClass
para crear una instancia de StaticNestedClass
.
Ejemplo 3: Clase interna anónima
public class OuterClass {
public static void main(String[] args) {
Runnable runnable = new Runnable() {
@Override
public void run() {
System.out.println("Running from Anonymous Inner Class");
}
};
new Thread(runnable).start();
}
}
Este ejemplo muestra una clase interna anónima que implementa la interfaz Runnable
. Se utiliza para proporcionar una implementación específica del método run
sobre la marcha.
Consejos y buenas prácticas
- Utilízalo con moderación: Las clases internas pueden dificultar la lectura del código si se utilizan en exceso. Utilízalos cuando pertenezcan lógicamente a la clase exterior.
- Clases anónimas: Ideal para implementar interfaces o clases abstractas con poca funcionalidad.
- Acceder a los miembros: Las clases internas pueden acceder a todos los miembros de la clase externa, incluidos los miembros privados, lo que las hace útiles para la encapsulación.
- Clases estáticas anidadas: Se utiliza cuando la clase anidada no necesita acceder a los miembros de instancia de la clase externa.
- Evita la complejidad: Mantén sencillas las clases internas para evitar aumentar la complejidad de la clase externa.