Clases anidadas — son clases definidas dentro de otra clase. Pueden ser:
Ejemplo de una clase anónima:
Button b = new Button(); b.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // acción al hacer clic } });
Características:
¿Puede una clase interna (non-static inner) contener métodos o variables estáticas?
Respuesta: No, no puede, excepto constantes (static final). Solo la clase anidada estática (static nested class) puede tener miembros estáticos.
Ejemplo (error):
class Outer { class Inner { static int x = 10; // ¡Error de compilación! } }
Correctamente sería así:
class Outer { static class StaticNested { static int x = 10; // OK } }
Historia
En una aplicación de Android se utilizó una clase interna como manejador de eventos. El manejador se almacenaba en un campo estático y mantenía una referencia implícita a la Activity, lo que causaba una fuga de memoria al destruirla, y la aplicación empezaba a "filtrarse", hasta llegar a OutOfMemoryError.
Historia
En uno de los microservicios se utilizaron clases anónimas que hacían referencia a variables externas iteradoras. Después de la refactorización, las variables dejaron de ser effectively final, y el código dejó de compilarse — los desarrolladores buscaron durante mucho tiempo la causa, hasta que recordaron esta limitación.
Historia
En una biblioteca se utilizaron variables estáticas dentro de una clase interna, pensando que era una práctica común. En nuevas versiones de JDK, el proyecto dejó de compilarse, ya que el estándar comenzó a seguir más estrictamente las limitaciones. Se necesitó una reestructuración urgente de la arquitectura.