programacion - modulos en java
Modularidad en Java: nivel superior vs. clases anidadas (4)
A los tutoriales de Java que leí, les gusta usar clases anidadas para demostrar un concepto, una característica o un uso.
Esto me llevó a implementar inicialmente un proyecto de muestra que creé así: muchas clases anidadas en la clase de actividad principal.
Funciona, pero ahora tengo un monstruoso archivo .java monolítico. Me parece un poco incómodo y ahora tengo la intención de romper con múltiples archivos / clases .java.
Sin embargo, se me ocurrió que a veces puede haber razones para no tomar clases de su clase adjunta.
De ser así, ¿cuáles son buenas razones para mantener un módulo grande, teniendo en cuenta la modularidad y la facilidad de mantenimiento?
¿Hay casos en los que no es práctico (o incluso imposible) convertir una clase anidada en una clase de nivel superior? En otras palabras, ¿hay algún caso en el que solo una clase anidada pueda satisfacer cierta funcionalidad?
Además del beneficio del cierre (ya señalado en otra respuesta), las clases anidadas también lo ayudan a lograr herencia de implementación múltiple (ref: Thinking in Java, página 369 - sección "¿Por qué inner classes?"). Hasta donde yo sé, no hay otra manera de lograrlo. Por lo tanto, si su clase anidada lo está ayudando a lograr la herencia de implementación múltiple, entonces no sería posible convertirla en una clase de nivel superior anidada.
Las clases anidadas le permiten separar limpiamente algunas funcionalidades que pertenecen a la clase externa y al mismo tiempo mantener esa funcionalidad cerca de la clase externa. En tales casos, las clases anidadas proporcionan la mejor opción desde la perspectiva del diseño y eso solo puede ser la razón para no convertirla en una clase de nivel superior (lo que puede generar contaminación de clase en el paquete principal).
Puede ser más fácil leer todas las clases si están en el mismo archivo. Esta es la razón por la cual este enfoque es bueno, por ejemplo, el código.
Sin embargo, para el código real, debe dividir sus archivos / clases en tamaños manejables. El archivo de clase más largo en Java 6 tiene aproximadamente 9000 líneas de longitud. Tiendo a mantener las clases más cortas que esta. ;)
Sí. Las clases internas (clases anidadas no estáticas) pueden referirse a variables de instancia de la clase contenedora.
Además, las clases anidadas pueden acceder a miembros privados de la clase contenedora.
una clase anidada no estática tiene una referencia implícita a la instancia del creador de la clase adjunta, y también puede acceder a cada miembro de la clase adjunta (incluso a los miembros privados). Pierdes esto si haces el nivel superior de la clase anidada:
public class Outer {
private String s;
public void setS(String s) {
this.s = s;
}
public class Inner {
public String getOuterS() {
// This is legal only if Inner is
// non-static and nested in Outer
return s;
}
}
}
public class Main {
public static void main(String[] args) {
Outer o = new Outer();
o.setS("Hello world!!!");
// i now has access to every o member
Outer.Inner i = o.new Inner();
// Prints "Hello world!!!"
System.out.println(i.getOuterS());
}
}