En Java, existen cuatro tipos de clases anidadas:
Static nested class no tiene acceso directo a los miembros no estáticos de la clase externa. Se compila como una clase separada, y sus instancias no mantienen una referencia oculta al objeto envolvente.
Inner class (non-static) conserva una referencia implícita al objeto externo y puede acceder a sus campos. Este tipo de clase se usa más a menudo para implementar escuchadores o iteradores con acceso a los datos del objeto externo.
class Outer { static class Nested { // static void foo() {} } class Inner { // non-static void bar() { System.out.println(value); // acceso al campo externo } } int value = 42; }
Utiliza static nested class para constructos utilitarios o auxiliares que están relacionados con la clase externa en significado, pero que no requieren acceso a su estado. Utiliza inner class si necesitas tener acceso directo a los miembros no estáticos de la clase externa para una integración más estrecha.
Pregunta: "¿Puede la static nested class acceder directamente a los campos no estáticos de una instancia de la clase externa?"
Respuesta: No, la static nested class no puede acceder directamente a los campos o métodos no estáticos de una instancia de la clase externa, ya que no contiene (y no mantiene) una referencia al objeto de la clase externa.
Historia
En una biblioteca para el almacenamiento de datos en caché, se utilizó una static nested class, suponiendo que podría acceder a los ajustes de configuración de la clase externa. Después de intentar acceder, surgió un error de compilación: la clase interna no veía los campos no estáticos, por lo que fue necesario cambiar la arquitectura.
Historia
En la interfaz de una aplicación gráfica, se utilizó inner class en lugar de static nested class para constantes, lo que resultó en una referencia implícita innecesaria al objeto externo. Esto llevó a que el recolector de basura no pudiera limpiar correctamente la memoria, lo que provocó fugas.
Historia
Al serializar una colección que contenía clases internas, surgió un problema: la inner class mantenía una referencia al objeto padre y, al serializar, se serializaba todo el árbol de dependencias, lo que ralentizaba el proceso y aumentaba el tamaño del resultado. Después de cambiar a static nested class, el problema desapareció.