¿Cuáles son los propósitos de las clases internas?

7 minutos de lectura

Estoy revisando el concepto de clases internas en Java. tan lejos de lo que he entendido y aplicado, las clases internas de Java tienen un enlace o acceso a los métodos y campos de su clase externa/ envolvente.

Mi pregunta:

  1. ¿Cuándo se debe crear o definir una clase interna?
  2. ¿Se considera que las clases internas se denominan “clases auxiliares”?
  3. ¿Cuáles son los indicadores para que hagas una clase interna y cuál es su otro propósito?

  • Mira esto: stackoverflow.com/questions/2284396/…

    – Fritz

    9 de julio de 2012 a las 15:28

avatar de usuario
kosa

Las clases internas son mejores para el propósito de agrupar lógicamente las clases que se usan en un solo lugar. Por ejemplo, si desea crear una clase que SOLO utilice la clase adjunta, entonces no tiene sentido crear un archivo separado para eso. En su lugar, puede agregarlo como “clase interna”

según tutoría java:

Las razones convincentes para usar clases anidadas incluyen las siguientes:

  • Es una forma de agrupar lógicamente clases que solo se usan en un lugar.
  • Aumenta la encapsulación.
  • Puede conducir a un código más legible y mantenible.

  • Esto no es Javadoc, es el Tutorial de Java, y se trata de clases anidadas, no de clases internas, que son un caso especial.

    – usuario207421

    12 de febrero de 2019 a las 4:48

  • @ user207421 sí, parte del tutorial, estoy de acuerdo. Entonces, ¿las clases internas NO son clases anidadas? Pero la primera línea de este tutorial dice “El lenguaje de programación Java le permite definir una clase dentro de otra clase. Dicha clase se llama clase anidada” Y la sección que ve si se desplaza hacia abajo un poco con el título “Clase interna” muestra exactamente un ejemplo similar.

    – kosa

    12 de febrero de 2019 a las 5:26

avatar de usuario
eran

Un uso clásico de una clase interna es la implementación de un iterador dentro de un contenedor (Lista de arreglopor ejemplo, busque class Itr). Todo lo que el contenedor quiere exponer al resto del mundo es una Iterator. Sin embargo, tiene que crear alguna implementación concreta de ese iterador, posiblemente familiarizada con las partes internas del contenedor. El uso de una clase interna oculta la implementación, manteniéndola cerca de la implementación del contenedor. Y al ser interno (es decir, no estático), está vinculado a una instancia específica de ese contenedor, lo que le permite acceder a miembros privados del contenedor.

Existen algunos tipos de clases internas – Clase anidada no estática, clases locales y clases anónimas. Cada uno tiene un propósito algo diferente, por lo que cuando preguntes por una clase interna, debes especificar de qué tipo estás hablando.

Suponiendo que se refiera a clases internas no estáticas, diría que la razón para usarlas es la misma que usar clases normales (es decir, abstracción y división del código en unidades lógicas), pero no hay razón para hacer visible este uso de clases. al resto del mundo. También puede hacer públicas las clases anidadas, por supuesto, en cuyo caso las haría anidadas en lugar de independientes para expresar su estrecha relación con la clase externa.

  • Una clase anidada no estática también se conoce como clase interna. No es un tipo de clase interna.

    – akhil_mittal

    02/04/2015 a las 11:39

avatar de usuario
fred foo

  1. Ver el Tutoría Java por las razones principales.

  2. Si por “clase auxiliar” te refieres a algo solo para uso interno, entonces no, no necesariamente. Es posible que desee hacer algo como

    class Outer {
        private static class Inner implements InterestingInterface {
            // whatever
        }
        public InterestingInterface make_something_interesting() {
            return new Inner();
        }
    }
    

    Aquí, Inner no es una “clase de ayuda” en el sentido de que el mundo exterior puede ver instancias de ella, pero su implementación está completamente oculta: el mundo exterior solo sabe que obtiene algún objeto que implementa InterestingInterface.

  • Entonces, ¿esta es una de las razones por las que dicen que las clases internas aumentan la encapsulación?

    – usuario962206

    9 de julio de 2012 a las 15:37

  • @ usuario962206: sí. Ningún cliente necesita siquiera saber que lo que recibe es realmente una instancia de una clase interna, o que dicha clase existe dentro Outer.

    – Fred Foo

    9 de julio de 2012 a las 15:41


avatar de usuario
marca burleigh

Como regla general, objetos debiera ser diseñado para única responsabilidad (Altamente cohesivo). En otras palabras, cualquier objeto bien diseñado debe realizar un única tarea coherente. Esto se consideraría la mejor práctica para el diseño orientado a objetos.

A veces, sin embargo, un desarrollador puede diseñar una clase que requiere un separado especializado clase para poder trabajar. esta separada especializado clase puede ser considerada como clase de ayudante.

Si el ayudante la clase es no utilizado por ninguna otra claseentonces se consideraría un candidato principal como un clase interna

Como lo provoca ncmathsadist arriba, un ejemplo del uso de la clase interna sería en la implementación de Controladores de eventos.

Por ejemplo, al diseñar una interfaz gráfica de usuario (GUI), un desarrollador puede haber creado un botón que realiza a especial tarea después de que el usuario lo presione.

El botón necesitaría un controlador de eventos cual escucha para cuando se presiona ese botón en particular.

En este caso, crear el controlador de eventos para el botón como un clase interna sería mejores prácticas ya que la clase interna no se utilizaría en ningún otro lugar que no sea con el botón específico dentro de la clase GUI.

avatar de usuario
ncmathsadist

Uno de los propósitos de las clases internas es adjuntar oyentes. Por ejemplo, suponga que tiene un JMenuItem. Puede hacer que salga de su aplicación como se muestra en este código:

JMenuItem quitItem = new JMenuItem("Quit");
quitItem.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e)
    {
        //cleanup code before exiting
        System.exit(0);
    }
});

También es posible que desee que una clase tenga acceso a las variables de estado de la clase externa, lo que está completamente subordinado a esa clase. Por ejemplo, considere escribir una calculadora de color simple. Puede tener un área de texto en la que escriba un código hexadecimal. Cuando presiona enter, desea que un JPanel muestre el color. Aquí hay un bosquejo crudo de lo que podrías hacer.

public class ColorCalc extends JPanel implements Runnable
{
    Color displayedColor;
    JTextArea colorEnterArea;
    public ColorCalc()
    {
        displayedColor = Color.white
        colorEnterArea = new JTextArea();
    }
    public void run()
    {
        //build GUI here
    }
    public static void main(String[] args)
    {
         ColorCalc cc = new ColorCalc();
         javax.swing.SwingUtilities.invokeLater(cc);
    }
    //subservient inner class with access to outer class state variable.
    class ColorPanel extends JPanel
    {
         public void paintComponent(Graphics g)
         {
             g.setColor(displayedColor);
             g.fillRect(0,0,getWidth(), getHeight());
         } 
    }

}

avatar de usuario
espina

Esta es una cuestión de estilo. Cualquier cosa que se pueda hacer con una clase interna también se puede hacer como una serie de clases externas. Las clases internas son especialmente útiles para las clases que son ligeras o están estrechamente vinculadas a la clase envolvente. Por ejemplo, un comparador es frecuentemente ambas cosas. Necesita un conocimiento profundo de la implementación de la clase y puede tener solo unas pocas líneas. Puede ser un candidato ideal como clase interna.

avatar de usuario
027

Si encuentra que hay suficiente código que la clase podría hacer mejor, ya que la clase nos proporciona para especificar estadísticas y comportamiento con campos y métodos y no desea que esta clase se use fuera de la clase adjunta. deberías usar la clase interna.

Aquí la clase interior está oculta del mundo exterior. La clase interna puede acceder al miembro privado de la clase envolvente que nos proporciona encapsulación.

Permítanme dar un ejemplo. Suponga que desea configurar el engranaje para que funcione en ciclo y tiene una regla comercial como si solo hubiera hasta 6 engranajes. Entonces puede crear un ciclo de clase interna que tendría un método para configurar el engranaje. Ese método tiene alguna validación que se verifica antes de configurar la marcha. Como si el ciclo estuviera en marcha… el número de marcha es inferior a 6…

el mejor ejemplo es que el código de manejo de eventos usa clases internas (a veces clases internas anónimas) para crear eventos y oyentes sin crear clases separadas de objetos de eventos y oyentes de eventos para su evento.

¿Ha sido útil esta solución?

Esta web utiliza cookies propias y de terceros para su correcto funcionamiento y para fines analíticos y para mostrarte publicidad relacionada con sus preferencias en base a un perfil elaborado a partir de tus hábitos de navegación. Al hacer clic en el botón Aceptar, acepta el uso de estas tecnologías y el procesamiento de tus datos para estos propósitos. Configurar y más información
Privacidad