Contenido de certificación
Buscar
Social
Ofertas laborales ES
« Cambios en la Ruta de Certificación para Java 7 | Main | Genéricos y Colecciones. Parte 1: Sobreescribiendo equals y hashCode »
martes
oct042011

Ejemplo de Inner Clases

Este es un concepto polémico en Java.

Básicamente, después de estudiarlo, he llegado a las siguientes conclusiones:

1) Una inner class es una clase íntima con su clase outer.

2) Una inner class puede definir sus propias variables y acceder a las variables de outer.

3) Desde la clase outer, se puede instanciar inner classes y usarlas.

A continuación, introducimos un ejemplo descriptivo de inner clases. Básicamente, vemos que tenemos un array con datos y estos son recorridos mediante un iterador interno, que va recorriendo de dos en dos las posiciones e imprimiendo la información.

Un cordial saludo y suerte,

Jaime.

001./**
002. 
003.* Ejemplo de creacion de una outer class e inner class
004. 
005.* Esto es DataStructure es outer class, y después
006. 
007.* el método printEven, se apoya en una clase interna, llamada InnerEvenIterator,
008. 
009.* que básicamente accede a los datos de DataStructure y mediante una variable
010. 
011.* iterador interna los va recorriendo de dos en dos e imprimiéndolos.
012. 
013.* @author jaime
014. 
015.* Fuente: Oracle
016. 
017.*
018. 
019.*/
020. 
021.  
022. 
023./**
024. 
025.* INNER CLASSES
026. 
027.* Atributos: SIZE definido como final, array de ints.
028. 
029.*
030. 
031.*/
032. 
033.public class DataStructure {
034. 
035.//create an array
036. 
037.private final static int SIZE = 15;
038. 
039.private int[] arrayOfInts = new int[SIZE];
040. 
041./**
042. 
043.* Constructor: acceso sin problema a las variables.
044. 
045.*/
046. 
047.public DataStructure() {
048. 
049.//fill the array with ascending integer values
050. 
051.for (int i = 0; i < SIZE; i++) {
052. 
053.arrayOfInts[i] = i;
054. 
055.}
056. 
057.}
058. 
059./**
060. 
061.* PrintEven, creamos un InnerEventIterator (clase interna, que tiene íntima relación
062. 
063.* con nuestra clase) y vamos recorriendo e imprimiendo los valores pares del array.
064. 
065.*/
066. 
067.public void printEven() {
068. 
069.//print out values of even indices of the array
070. 
071.InnerEvenIterator iterator = this.new InnerEvenIterator();
072. 
073.while (iterator.hasNext()) {
074. 
075.System.out.println(iterator.getNext() + " ");
076. 
077.}
078. 
079.}
080. 
081./**
082. 
083.* Clase interna.
084. 
085.* InnerEventIterator: tiene un atributo next y después dos métodos internos, que pueden acceder
086. 
087.* a arrayOfInts (atributo interno de DataStructure.
088. 
089.* @author jaime
090. 
091.*/
092. 
093.private class InnerEvenIterator {
094. 
095.//Contador, que empieza en la posición 0
096. 
097.private int next = 0;
098. 
099.public boolean hasNext() {
100. 
101.//Comprueba si el elemento actual es el último dentro del array
102.return (next <= SIZE - 1);
103. 
104.}
105. 
106.public int getNext() {
107. 
108.//Registra un valor dentro del índice par del array.
109.int retValue = arrayOfInts[next];
110. 
111.//Obtiene el siguiente elemento y lo devuelve
112. 
113.next += 2;
114. 
115.return retValue;
116. 
117.}
118. 
119.}
120. 
121./**
122. 
123.* Método main de prueba
124. 
125.* @param s
126. 
127.*/
128. 
129.public static void main(String s[]) {
130. 
131.//Cremos un objeto y llamamos al método printEvent, que hemos visto que creará
132.//una clase inner interna para gestionar el método
133.DataStructure ds = new DataStructure();
134. 
135.ds.printEven();
136. 
137.}
138.}

Reader Comments (4)

Gracias por la explicación de las inner y outer class, es muy clara, el pero que pongo es que no entiendo cuando conviene usar las clases inner y por qué.

octubre 10, 2011 | Registered CommenterElfeijo

Un ejemplo muy típico de las inner classes son Iterator que deben coservar el estado dentro del ciclo.

Este código es de la clase AbstractList de Java:


public ListIterator<E> listIterator(final int index) {
if (index<0 || index>size())
throw new IndexOutOfBoundsException("Index: "+index);

return new ListItr(index);
}


private class ListItr extends Itr implements ListIterator<E> {

ListItr(int index) {
cursor = index;
}

public boolean hasPrevious() {
return cursor != 0;
}
....

octubre 13, 2011 | Registered Commenterajaristi

Digamos que Inner Classes se usa cuando quieres tener una clase con íntima relación con otra, y no te interesa su uso fuera de ella.
Por ejemplo: Un array de datos (clase outer, puede instanciar la clase iterador, clase inner o "interna" para recorrer la información) y su iterador (clase inner, con acceso a los datos de la clase outer o clase "externa"). En este ejemplo, el iterador no tiene sentido fuera de la clase outer.
Espero haberte ayudado,
Saludos,
Jaime.

noviembre 2, 2011 | Registered Commenterjcarmonaloeches

Pues un poco tarde pero gracias por las respuestas :)

diciembre 30, 2011 | Registered CommenterElfeijo

PostPost a New Comment

Enter your information below to add a new comment.

My response is on my own website »
Author Email (optional):
Author URL (optional):
Post:
 
Some HTML allowed: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <code> <em> <i> <strike> <strong>