Supongamos que tengo una clase 'Aplicación'. Para inicializarse, requiere ciertas configuraciones en el constructor. Supongamos también que la cantidad de configuraciones es tan alta que resulta convincente ubicarlas en una clase propia.Clases anidadas "públicas" o no
Compare las siguientes dos implementaciones de este escenario.
Implementación 1:
class Application
{
Application(ApplicationSettings settings)
{
//Do initialisation here
}
}
class ApplicationSettings
{
//Settings related methods and properties here
}
Aplicación 2:
class Application
{
Application(Application.Settings settings)
{
//Do initialisation here
}
class Settings
{
//Settings related methods and properties here
}
}
Para mí, el segundo enfoque es mucho más preferible. Es más legible porque enfatiza fuertemente la relación entre las dos clases. Cuando escribo código para instanciar la clase Application en cualquier lugar, el segundo enfoque se verá más bonito.
Ahora imagina que la clase de Configuración a su vez tenía una clase similar "relacionada" y esa clase a su vez también lo hizo. Vaya solo a tres niveles y el nombre de la clase se salga de control en el caso "no anidado". Si anida, sin embargo, las cosas siguen siendo elegantes.
A pesar de lo anterior, he leído personas que decían en StackOverflow que las clases anidadas se justifican solo si no son visibles para el mundo exterior; eso es si se usan solo para la implementación interna de la clase contenedora. La objeción comúnmente citada es hinchar el tamaño del archivo fuente de la clase que contiene, pero las clases parciales son la solución perfecta para ese problema.
Mi pregunta es, ¿por qué tenemos cuidado con el uso "públicamente expuesto" de las clases anidadas? ¿Hay algún otro argumento en contra de tal uso?
Tuve que escribir un código de generador recientemente y recordé esta publicación. Resultó ser un enfoque muy útil, así que gracias. –
* "También permite que el constructor acceda a miembros privados de la clase externa" * Solo con una referencia explícita, correcta (estoy bastante seguro de que no está implícita como en las clases internas de Java) ?. – samosaris
@SamusArin: Sí, no hay referencia implícita a una instancia de la clase contenedora. Pero también tienes acceso a miembros estáticos. Básicamente, estaba * solo * hablando de accesibilidad. –