utiliza una que privada otra objeto nombre llevan internas interna dentro cuando crear clases clase abstractas java inner-classes

java - que - cuando se utiliza una clase interna



Cuándo usar clases internas en Java para clases de ayuda (11)

Cuándo usar clases internas?

  1. La clase interna no necesita ningún archivo adicional o separado para colocar.
  2. Las clases internas son comparativamente pequeñas y están estrechamente vinculadas con la clase "padre" o clase "externa". Evita muchas clases de ayudantes y ajustes para explicar el principio de contención OOD.
  3. Todo el código en el mismo archivo aumenta la legibilidad y aumenta el rendimiento (como el código en línea). Su importancia está creciendo en la codificación y se trata como una buena práctica.
  4. Las clases internas anónimas son muy útiles cuando quiere definir devoluciones de llamada sobre la marcha.
  5. Un objeto de una clase interna puede acceder a la implementación del objeto que lo creó, INCLUYENDO datos privados.

Si tengo, por ejemplo, una clase junto con una clase auxiliar para hacer algunas de sus funciones, ¿tiene sentido hacerlo como una clase interna?

public class Foo { private FooHelper helper; // constructor & any other logic public void doSomeThing() { helper.do(); } } public class FooHelper { public void do() { // code } }

En el caso anterior, ¿tiene sentido hacer que el FooHelper sea ​​una clase interna? Disculpe si suena estúpido, pero estoy un poco confundido sobre los casos de uso.


¿Cuál es el alcance de Foo ? Cuando Foo es una clase de modelo de dominio con su propio ciclo de vida y el helper es un servicio común, parece que se mezclan dos objetos con un alcance / ciclo de vida muy diferente.

Normalmente, la entidad de dominio tiene su propio ciclo de vida desde la creación, persistencia hasta su GC. Por otro lado, el helper o servicio es estático o mejor dinámico con un ciclo de vida igual a toda la aplicación, por ejemplo, Spring Bean.

Una vez que su entidad de dominio contenga la referencia de un servicio, puede ocasionarle serios problemas. Por ejemplo, todas las llamadas al repositorio Get necesidad de insertar una referencia de este servicio en la entidad de dominio. Yo recomendaría evitar este patrón.

No es evidente para mí quién hará una instancia de Helper para ti.


Aquí hay algunos usos de las clases internas.

  • Las clases internas se usan para obtener funcionalidades que pueden hacer que un objeto sea mejor que el método.
  • Se pueden usar en el caso cuando se requiere un conjunto de operaciones múltiples y las posibilidades de reutilización son buenas dentro de la clase y no se accederá a ellas, sino a métodos externos a la clase externa.
  • Las clases internas están hechas para lograr herencia múltiple también.
  • Las clases internas se usan cuando son útiles en el contexto de la clase.
  • Se usan para separar la lógica dentro de las clases.

Entonces, si tiene algún requisito que coincida con los puntos anteriores, se pueden usar las clases internas. Siempre es mejor hacer que la clase interna sea private para evitar el acceso de otras clases. En su caso, el uso de clases internas es útil para hacer que el código sea legible y separar la lógica en la clase externa.


Hay dos tipos adicionales de clases internas. Puede declarar una clase interna dentro del cuerpo de un método. Estas clases se conocen como clases locales. También puede declarar una clase interna dentro del cuerpo de un método sin nombrar la clase. Estas clases se conocen como clases anónimas.

Clase local: Úselo si necesita crear más de una instancia de una clase, acceder a su constructor o introducir un nuevo tipo con nombre (porque, por ejemplo, necesita invocar métodos adicionales más adelante).

Clase anónima: Úselo si necesita declarar campos o métodos adicionales.


Hild, sí, tiene sentido usar una clase interna en muchos casos.

Piénselo de esta manera: la clase interna vivirá y morirá con la clase externa, por lo que cualquier funcionalidad que se necesite específicamente para la clase externa se puede agregar a la clase interna. Ejemplos populares son: oyentes en la mayoría de los casos: tipos de oyentes de teclado, oyentes de mouse, oyentes de evento.

Las clases en Java le permiten tener una funcionalidad específica, pero a veces puede necesitar tener una funcionalidad especializada separada, pero también debe estar íntimamente ligada a la clase que está diseñando.

Puede haber cuatro tipos de clases internas. Una simple búsqueda en Google puede ayudarlo a obtener más información sobre ellos.



Las clases internas tienen sentido cuando son pequeñas y no necesitan nombres. Los oyentes en las GUI son ejemplos clásicos en los que tienen sentido.

Si la clase es grande e importante, debe nombrarse y colocarse en un archivo separado.

Las clases de oyentes en los ejemplos de GUI normales hacen una pequeña cosa, por lo general solo se envían a alguna otra función para hacer un trabajo real.

También a menudo uso clases anidadas estáticas (que técnicamente no son clases internas) para clases que solo se usan en el contexto de otra clase: Map.Entry es un buen ejemplo de esto. Solo se utiliza junto con un Mapa, por lo que tener la definición de Entrada como parte de la interfaz del Mapa tiene sentido organizativo.

Generalmente no tengo mucho uso para otros tipos de clases anidadas, como clases de miembros no estáticos y clases locales. Pero ocasionalmente son útiles. Para obtener un buen ejemplo de un uso legítimo de las clases miembro, consulte el código fuente de LinkedList.ListItr. Esta es una clase interna privada cuyo propósito es proporcionar una implementación de ListIterator para LinkedList . Para hacer esto, es útil tener acceso a los datos privados dentro de LinkedList. Para lograr esto utilizando solo clases de nivel superior, habría sido necesario exponer más métodos públicos en LinkedList para permitir que ListIterator llegue a la implementación subyacente de LinkedList. En cambio, el uso de una clase interna permite a LinkedList mantener su implementación privada, como debería ser.


Sí, la ventaja de usar clase interna es que puede acceder a los miembros de la clase externa. En su caso, si cree que su FooHelper no debe ser utilizado por ninguna otra clase, puede convertirlo en una clase interna.

Para ver la utilidad de la clase interna, repase los ejemplos de AWT. Las clases internas anónimas son ampliamente utilizadas en los controladores de eventos.


Sí, tiene perfecto sentido convertirlo en una clase interna. Si ninguna otra clase lo necesita, hazlo en privado. Si no requiere acceso exclusivo a los miembros de la clase externa, conviértalo en una clase anidada estática porque requerirá menos espacio de memoria.

Echa un vistazo a la recomendación del tutorial oficial -

Utilice una clase anidada no estática (o clase interna) si necesita acceder a los campos y métodos no públicos de una instancia envolvente. Use una clase anidada estática si no necesita este acceso.


Si crees que FooHelper no será en absoluto útil para otras clases aparte de Foo , entonces tiene sentido hacerlo como clase private interna de Foo . Un ejemplo de este tipo de diseño se puede encontrar en HashMap donde define un KeySet clase interna privada

De lo contrario, tenerlo como una instancia private ve bien.


De JAVA SE Docs

¿Por qué usar clases anidadas?

Es una forma de agrupar lógicamente clases que solo se usan en un solo lugar: si una clase es útil solo para otra clase, entonces es lógico incluirla en esa clase y mantener las dos juntas. Anidar tales "clases de ayuda" hace que su paquete sea más eficiente.

Aumenta la encapsulación: Considere dos clases de nivel superior, A y B, donde B necesita acceso a los miembros de A que, de lo contrario, serían declarados privados. Al ocultar la clase B dentro de la clase A, los miembros de A pueden declararse privados y B puede acceder a ellos. Además, B puede ocultarse del mundo exterior.

Entonces, sí, tiene sentido usar FooHelper como una clase interna.