Posts Tagged ‘class’

Clases internas en Java (Inner/nested classes)

Martes, septiembre 7th, 2010

Clases internas en Java (Inner/nested classes)

Una clase interna se crea si necesitamos una estrecha relación entre 2 clases diferentes (y la clase interna no tiene sentido de existir sin la presencia de la clase externa). Con esto las variables y métodos de la clase principal se encuentran visibles para la clase interna, incluso aquellos marcados como privados (private).

En forma sencilla este es un ejemplo de clase interna:

class Externa {
	class Interna { }
}

La visibilidad de las clases internas pueden ser modificadas.
Vean este ejemplo de clases internas, tomado de Sun Oracle:

public class DataStructure {
    //create an array
    private final static int SIZE = 15;
    private int[] arrayOfInts = new int[SIZE];

    public DataStructure() {
        //fill the array with ascending integer values
        for (int i = 0; i < SIZE; i++) {
            arrayOfInts[i] = i;
        }
    }

    public void printEven() {
        //print out values of even indices of the array
        InnerEvenIterator iterator = this.new InnerEvenIterator();
        while (iterator.hasNext()) {
            System.out.println(iterator.getNext() + " ");
        }
    }

    //inner class implements the Iterator pattern
    private class InnerEvenIterator {
        //start stepping through the array from the beginning
        private int next = 0;

        public boolean hasNext() {
            //check if a current element is the last in the array
            return (next <= SIZE - 1);
        }

        public int getNext() {
            //record a value of an even index of the array
            int retValue = arrayOfInts[next];
            //get the next even element
            next += 2;
            return retValue;
        }
    }

    public static void main(String s[]) {
        //fill the array with integer values and print out only values of even indices
        DataStructure ds = new DataStructure();
        ds.printEven();
    }
}

Un detalle importante es cómo acceder a la instancia de la clase externa desde la que fue creada la clase interna usando la palabra reservada "this". Para ello basta con colocar "this" inmediatamente después del nombre de la clase:

class Externa {
	class Interna {
           System.out.println(Externa.this);
        }
}

Para el sentido contrario no es necesario una forma especial de llamada debido a que la clase externa fue la que creó instancias de la clase interna y es mediante esas referencias que uno invoca o maneja los objetos de la clase interna.

Te puede servir revisar:

http://download.oracle.com/javase/tutorial/java/javaOO/nested.html

http://download.oracle.com/javase/tutorial/java/javaOO/innerclasses.html

http://download.oracle.com/javase/tutorial/java/javaOO/summarynested.html