Tutorial de Java

Aplicación de Control

Anterior | Siguiente
Ahora que ya se han visto ejemplos de la sintaxis y semántica que describen la forma de trabajar de las clases anidadas, llega el momento de plantearse el porqué de su existencia e incorporación a Java. Y la respuesta se va a proporcionar con el siguiente ejemplo, que es algo así como una aplicación de control, que ahora se intentará explicar.

Se podría decir que una aplicación sería una clase o un conjunto de clases diseñadas para resolver un determinado problema. Para utilizar esta aplicación, sería necesario heredar de una o más clases y sobrecargar uno o más métodos. El código que se escriba en esos métodos sobrecargados hará que la solución general proporcionada por la aplicación resuelva el problema específico al que se aplica. La aplicación de control sería un tipo especial de aplicación dominado por la necesidad de responder a eventos, y uno de los más importantes problemas con que se encuentra uno es la programación del interfaz gráfico, que está totalmente controlado por eventos. El modelo AWT del JDK 1.1 sería una aplicación de control que resuelve elegantemente el problema del interfaz gráfico utilizando clases anidadas.

Para comprobar como las clases anidadas permiten crear y utilizar aplicaciones de control, se verá a continuación un ejemplo que tratará de ejecutar eventos cuando estén "listos". Aunque "listos" puede significar cualquier cosa, en este caso concreto, se utilizará una base de tiempo, la hora del sistema, para saber cuando están listos. Esta es una aplicación de control pura, cuando se llegue a la parte del AWT, se podrá comprobar también que las clases anidadas se pueden utilizar para describir de forma muy sencilla las acciones de un interfaz gráfico de usuario.

Centrándose en el ejemplo actual, a continuación está el código del interfaz que describe cualquier tipo de evento, sin contener información específica, java1203.java. Se trata de una clase abstracta en vez de un interface porque como se quiere, por defecto, basar el control en la hora, se necesita de antemano algún código incorporado.

abstract public class java1203 { 
    private long horaEvt; 

    public java1203( long horaEvento ) { 
        horaEvt = horaEvento; 
        } 
    public boolean listo() { 
        return( System.currentTimeMillis() >= horaEvt );
        } 
    abstract public void accion(); 
    abstract public String descripcion(); 
    } 

El constructor simplemente captura la hora cuando se quiere ejecutar el evento java1203, mientras que listo() dice cuando es el momento de la ejecución. Desde luego, listo() puede sobreescribirse para que el control del evento se base en cualquier otra cosa diferente de la hora.

El método accion() es el que se llama cuando el evento está listo(), y el método descripcion() presenta un texto de información sobre el evento java1203.

El fichero java1204.java, es el que contiene el código de la aplicación de control para manejar y lanzar eventos. La primera clase es en realidad una clase auxiliar para almacenar los objetos de tipo java1203, que se podría evitar si se utilizase algún tipo de colección de datos, pero como no se ha visto, por eso se coloca aquí este código extra.

ConjuntoEventos almacena 100 eventos de tipo java1203, si se utilizase una colección real, no habría que fijar un máximo, sino que ella misma se ajustaría al tamaño que tuviese la lista de eventos. indice se utiliza para apuntar al siguiente elemento libre, y siguiente se utiliza para saber cual es el siguiente evento en la lista. Esto es importante a ala hora de llamar a getSiguiente(), por los objetos java1203 se eliminan de la lista con borrarActual() una vez que se han ejecutado, así que getSiguiente() encontrará agujeros en la lista que hay que controlar.

Hay una cosa a observar más despacio; borraActual() no fija el indicador del objeto para decir que ya no se usa, sino que lo pone a null. Esto es muy importante, porque si el recolector de memoria llega y ve que el objeto está en uso, no hace nada, y sino dejaría un hueco. Así que cuando se pretenda utilizar un objeto más adelante y no andar buscando memoria, es una buena idea el fijarlo a null para negarle al recolector de memoria la actuación sobre él.

El código, o método, más interesante del ejemplo es ejecutar(). Este método recorre la lista almacenada en ConjuntoEventos buscando los eventos que se encuentran listos para ejecutar. Para cada uno que encuentra listo(), llama a su método accion(), imprime el texto de lo que hace llamando a descripcion() y luego elimina el evento de la lista.

En este diseño no se sabe nada sobre lo que hace el evento, simplemente hay una serie de métodos que realizarán diferentes acciones cuando formen parte de diferentes clases.

  1. Expresar la implementación completa de la aplicación de control en una sola clase. Las clases anidadas se usan para expresar los diferentes tipos de accion() necesarios para resolver el problema. Además, el siguiente ejemplo utiliza clases anidadas privadas en su implementación, por lo que están totalmente ocultas y pueden cambiarse con toda libertad.
  2. Las clases anidadas pueden acceder fácilmente a los métodos de la clase que las contiene. Sin esta posibilidad, el código sería bastante farragoso para proporcionar una alternativa.

El programa java1205.java muestra un ejemplo de aplicación de control diseñada para controlar los distintos aparatos de una casa. Cada acción es diferente: controlar luces, agua, calefacción, tocar el timbre o restaurar el sistema. Pero la aplicación de control está diseñada para que cada tipo de acción herede un nuevo evento java1203 de la clase anidada y sólo haya que escribir el código del método accion().

El control de luces, agua, calefacción y timbre cae fuera del control de la clase principal java1205, sin embargo, al ser clases anidadas no tendría ningún problema en acceder a sus campos. Reinicializacion es responsable de que el sistema se inicialice, y en los demás, se puede observar como las clases anidadas permiten algo que se asemeja a la herencia múltiple, porque Timbre tiene todos los métodos de java1203 y también tiene todos los métodos de la clase que la contiene, java1205.

Para la resolución del control de los elementos anteriores sin el uso de clases anidadas habría que escribir gran cantidad de código, que además sería difícil de seguir en su flujo. Las clases anidadas permiten una solución muy elegante y muy fácil de comprender. En secciones posteriores se mostrará que también presentan las clases anidadas muchas ventajas en la creación de interfaces gráficas, a la hora de describir sus acciones. No obstante, se supone que el lector, en este momento, está ya convencido de que las clases anidadas son un gran aporte a Java.

Navegador

Home | Anterior | Siguiente | Indice | Correo