2012-07-09 22 views
35

? Estoy revisando el concepto de clases internas en java. tan lejos de lo que he entendido y aplicado las clases internas de Java tiene un enlace o acceso a los métodos y campos de su clase externa/adjunta.¿Cuáles son los propósitos de las clases internas

Mi Pregunta:

  1. ¿Cuándo se debe crear o definir una clase interna?
  2. ¿las clases internas se consideran llamadas "clases de ayuda"?
  3. ¿Cuáles son los indicadores para que hagas una clase interna y cuál es su otro propósito?
+0

mira esto: http://stackoverflow.com/questions/2284396/java-anonymous-or-not-inner-classes-is-it-good-to-use-them – Gamb

Respuesta

32

Las clases internas son las mejores para agrupar lógicamente las clases que se usan en un solo lugar. Por ejemplo, si desea crear una clase que sea utilizada SOLAMENTE para encerrar una clase, entonces no tiene sentido crear un archivo separado para eso. En su lugar puede agregarlo como "clase interna"

Según javadoc:

razones de peso para el uso de clases anidadas incluyen los siguientes:

  • Es una forma de clases de lógica de agrupación que se encuentran solo se usa en un solo lugar .
  • Aumenta la encapsulación.
  • Puede conducir a un código más legible y mantenible.
11

Un uso clásico para una clase interna es la implementación de un iterador dentro de un contenedor (ArrayList, por ejemplo - buscar class Itr). Todo el contenedor quiere exponer al resto del mundo es un Iterator. Sin embargo, tiene que crear alguna implementación concreta de ese iterador, posiblemente familiarizado 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 de contenedor privados.

Hay a few types of inner classes - clase anidada no estática, clases locales y clases anónimas. Cada uno tiene un propósito algo diferente, así que cuando preguntes sobre una clase interna, debes especificar de qué tipo estás hablando.

Suponiendo que te refieres a clases internas no estáticas, diría que la razón para usarlas es lo mismo que usar clases regulares (es decir, abstracción y división del código en unidades lógicas), pero no hay razón para hacer esto uso de clases visibles para el resto del mundo. También puede hacer que las clases anidadas sean públicas, por supuesto, en cuyo caso las haría anidadas en lugar de independientes para expresar su estrecha relación con la clase externa.

+2

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

2
  1. Consulte el Java tutorial por las razones principales.

  2. Si por "clase de ayuda" quiere decir 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 no llega a ver ejemplos de ello, pero su aplicación se oculta por completo - el mundo exterior solo sabe que obtiene algún objeto que implementa InterestingInterface.

+0

así que esta es una de las razones por las que dicen que las clases internas aumentan la encapsulación? – user962206

+0

@ user962206: sí. Ningún cliente necesita siquiera saber que lo que recibe es realmente una instancia de una clase interna, o que tal clase existe dentro de 'Exterior'. –

2

Un propósito de las clases internas es adjuntar oyentes. Por ejemplo, supongamos que tiene un JMenuItem. Puede hacer que salga de su aplicación como se muestra en este fragmento de código.

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

Usted también puede querer una clase para tener acceso a las variables de estado de la clase exterior que está totalmente subordinada 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 presionas enter, quieres que un JPanel muestre el color. Aquí hay un resumen de lo que podrías hacer.

public class ColorCalc extends JPanel implements Runnable 
{ 
    Color displayedColor; 
    JTextArea colorEnterArea; 
    pubic 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()); 
     } 
    } 

} 
1

Esta es una pregunta acerca del estilo. Todo lo que se puede 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 livianas o están estrechamente ligadas a la clase que las incluye. Por ejemplo, un comparador es frecuentemente ambas cosas. Necesita un conocimiento profundo de la implementación de la clase, y solo puede tener unas pocas líneas. Puede ser un candidato ideal como una clase interna.

2

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

Aquí la clase interna se oculta del mundo exterior. clase interna puede tener acceso al miembro privado de la clase que lo contiene, que nos proporciona la encapsulación.

Déjeme dar un ejemplo ... Supongamos que quiere configurar el engranaje para que funcione y tiene una regla de negocios como que solo hay hasta 6 marchas. para que pueda crear Ciclo clase interna que tendría un método para configurar el equipo. Ese método tiene alguna validación que se comprueba antes de establecer el engranaje.como el ciclo se está ejecutando ... número de engranaje es menor que 6 ...

mejor ejemplo es el código de manejo de eventos utiliza clases internas (a veces clases internas anónimas) crear eventos y oyentes sin crear clases de detector de eventos de objeto de evento independiente y para su evento ..

-1

acabo considero que esto es sólo una característica del lenguaje. No recomendaría su uso si adoptamos OOD y obedecemos el principio SOLID.

1

Como regla general, objetos deben ser diseñados para una sola responsabilidad (altamente cohesivo ). En otras palabras, cualquier objeto diseñado así, se debe realizar una sola 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 una clase separada especializada con el fin de trabajar.Esta clase especializada se podría considerar una clase de ayuda .

Si la clase ayudante se no utilizado por ninguna otra clase, entonces sería considerado un primer candidato como una clase interior

Como provocada por ncmathsadist anteriormente, un el ejemplo del uso de clase interna estaría en la implementación de Manejadores de eventos.

Por ejemplo, en el diseño de una interfaz gráfica de usuario (GUI), un desarrollador ha creado un botón que realiza una tarea en particular después de que el usuario presiona la misma.

El botón necesitaría un manejador de eventos el que escucha para cuando se pulsa ese botón en particular.

En este caso, creando el controlador de eventos para el botón como una clase interna habría mejores prácticas como la clase interna no se utiliza en ningún otro lugar que no sea con el botón específica dentro de la clase de interfaz gráfica de usuario.

Cuestiones relacionadas