![](/imgs/logo_uniandes.png)

ISIS1206 - Estructuras de Datos

Revisión Java (Genericidad y Enumeraciones)

Objetivos

  • Entender los conceptos de:
    • Enumeración
    • Genericidad
  • Utilizar los mecanismos que ofrece Java para implementar enumeraciones y genericidad
  • Utilizar librerías de java para manejo de colecciones y arreglos

Enumeraciones

Las enumeraciones , o "Enum", en java, son tipos de datos que sólo permiten la creación de objetos previamente definidos por el usuario. Son útiles para casos en los que se tiene un determinado grupo de opciones limitadas, como por ejemplo, las diferentes pintas de un mazo de cartas. De esta manera, se pueden crear diferentes cartas que sólo pueden pertenecer a las picas, los diamantes, los corazones, o los tréboles.

public enum Pinta {
    PICAS, CORAZONES, DIAMANTES, TREBOLES;
}

Es importante notar que las enumeraciones son clases que permiten únicamente la creación de objetos previamente establecidos. Por lo tanto, pueden definirse atributos y métodos para los objetos de una enumeración:

public enum Pinta {
    PICAS("Negro"), CORAZONES("Rojo"), DIAMANTES("Rojo"), TREBOLES("Negro");

    private String color;

    private Pinta(String pColor)
    {
        color=pColor;
    }

    public String darColor()
    {
        return color;
    }
}

Note que el constructor es privado. De esta manera, solo los objetos que aparecen al principio de la enumeración pueden ser utilizados y no se puede crear ningún objeto nuevo.

Taller Parte 1

Con el fin de practicar el uso de las enumeraciones vamos a actualizar el proyecto de La Tienda visto en APO I. La idea es reemplazar las constantes utilizadas para manejar los tipos de producto por una enumeración.

  1. Descargue el proyecto desde el siguiente enlace La Tienda.
  2. Descomprima el proyecto en la carpeta donde tiene su repositorio.
  3. Inicie DrJava y seleccione en el menú principal Project->Open, luego seleccione el archivo project.xml que se encuentra en la carpeta taller_21. Esto abrirá el proyecto en DrJava.
  4. Compile, ejecute y juegue con la aplicación.
  5. En la clase "Producto" de este ejercicio se encuentran 3 constantes que manejan los posibles tipos de producto: Papelería, Supermercado, o Droguería. Realice las siguientes modificaciones al proyecto
    1. Cree una nueva enumeración que maneje los tipos de producto.
    2. Agregue a la enumeración los tipos disponibles en la tienda.
    3. Haga los cambios necesarios para que el sistema haga uso de la enumeración que creó en lugar de las constantes.

Genericidad

La genericidad en Java sirve para definir clases parametrizadas por tipos. Por otro lado, permite la comprobación del uso correcto de tipos de datos en tiempo de compilación y permite que el código sea reutilizado. Ésta última característica de la genericidad es extremadamente importante para un programador, y para el curso de estructuras de datos. Al crear estructuras de datos, es claro que lo ideal será poder utilizarlas para cualquier clase (cliente) y no solo para un caso en concreto. La parametrización permite que el usuario defina los tipos concretos que serán utilizados para una determinada clase lo que permite que sean usadas en muchos casos con aplicaciones diferentes.

Este es un ejemplo de parametrización utilizado en la clase ArrayList del paquete utils en java:


package java.util;

 public class ArrayList<E> extends AbstractList<E>{
   ...
   public E  get(int index) {
       rangeCheck(index);
       return elementData(index);
   }

    ...
 }

Esto permite que al declarar objetos de tipo ArrayList, sea posible definir exactamente qué tipo de objeto será contenido en el ArrayList:

ArrayList<Integer> a = new ArrayList<Integer>();

De esta manera, el arreglo solo acepta elementos de tipo Integer (error que se detecta en tiempo de compilación) y permite utilizar los métodos get,add,etc sin ningún tipo de cast.

Los tipos que parametrizan una clase pueden restringirse según ciertas necesidades. Por ejemplo, si la clase genérica va a tener un método que haga uso de compareTo, es necesario que el tipo del parámetro sea comparable. Para lograrlo, debe hacerse lo siguiente:

public class MiArreglo <E extends Comparable<E>>{
  ...
}

Así, el parámetro podrá ser sólo un objeto que implemente la interfaz "comparable" y pueda compararse con otros objetos de su misma clase. Si es necesario, esto se puede extender a todos los tipos que sean comparables a cualquier superclase de ellos (o ellos mismos):

public class MiArreglo <E extends Comparable<? super E>> { ... }

o de cualquier clase que extienda de ellos (o ellos mismos):

public class MiArreglo <E extends Comparable<? extends E>>{ ... }

Taller parte 2

Para poner en práctica el concepto de genericidad vamos a trabajar con los animales de un zoológico.

  1. Descargue y abra el proyecto zoólogico. Allí, encontrará clases de animales en un zoológico, la jerarquía de esas clases es la siguiente:

  2. Su trabajo consiste en crear una nueva clase genérica que contenga a los animales y utilizarlos para entender el funcionamiento de la genericidad.

    1. Cree una clase "Jaula" con un parámetro. El propósito de esta clase será contener los animales. Éstos son sus atributos y métodos:

      El parámetro T de la Jaula designará que tipo de animales que podrán ponerse en ella.

    2. En la clase Zoológico, cree una jaula nueva que tenga como parámetro la clase Jaguar. Modifique el método ejecutarPruebasGenericidad para que cree una nueva instancia de la clase Jaguar y asígnelo a la jaula utilizando el método asignarAnimal.

    3. Trate de invocar el método asignarAnimal con un tipo diferente, por ejemplo un objeto de la clase Serpiente. Notará que no es posible, ya que el compilador valida utilizando el parámetro con el que fue declarada la clase.

    4. Cambie el parámetro de la jaula a Animal y repita el paso anterior. Ya que todos los animales extienden de esa clase, notará que si es posible.

  3. Ahora se quiere poder comparar a los animales teniendo en cuenta su edad, el objetivo es identificar el animal más viejo. Para lograrlo, implemente la interfaz Comparable en la clase Animal.

    1. Modifique la clase Jaula para que el parámetro de la clase extienda de la clase Comparable.

    2. Implemente el método quienEsMayor en la clase Jaula haciendo uso del método compareTo del parámetro. No olvide que dado que se encuentra en la clase Jaula, puede acceder al atributo contenidoaunque este sea privado.

    3. Cree una Jaula nueva con parámetro Animal. Asigne a cada Jaula dos animales diferentes e implemente el método compararAnimales para comparar sus edades, pruébelo por consola con los métodos provistos en la clase Zoológico. No olvide que antes de comparar, debe asignarles edades.

    4. Haga la clase Mamifero comparable, no a sí misma, sino a la clase Animal, y haga override sobre el método compareTo para que compare las edades de los mamíferos, teniendo en cuenta que sus años deben multiplicarse por 3 para que quede en el equivalente humano. Recuerde que el método debe, sin embargo, recibir un Animal por parámetro. Deje que una de las jaulas contenga un animal y la otra un mamífero. Pruebe comparando sus edades nuevamente.

    5. Ahora, se desea que dos animales ocupen la misma Jaula. Para lograrlo, añada otro parámetro y otro contenido(atributo).

    6. Implemente los métodos para asignar y quitar al segundo parametro de la jaula.

    7. Modifique el método quienEsMayor para que compare los dos parámetros y retorne:

      • 1 si la Jaula actual tiene los dos animales mayores.
      • 0 si la Jaula actual tiene un animal menor y un animal mayor
      • -1 si la Jaula actual tiene los dos animales menores.

Ahora, puede decidir qué tipo de animales meter en la Jaula, e introducirlos. Puede experimentar cambiando el parámetro y comparando entre las diferentes clases del zoológico.

Taller parte 3 (lectura después del laboratorio)

Para completar la revisión sobre java debe leer la sección Librerías en la cual encontrará información sobre las librerías que ofrece java para realizar tareas como ordenamiento, búsqueda y la organización del framework Collections.

Reto (Opcional)

Implemente su propia versión de una estructura de datos que implemente la interfaz Collection. Experimente con diferentes maneras de construir los métodos que cambien su desempeño.

Entrega para bonificación

Fecha límite de entrega: Ver

  1. Verifique que su aplicación cumple con las condiciones descritas en Envío talleres. Para este caso debe entregar las dos carpetas.
  2. Realice pruebas unitarias para los casos del zoológico que realizó durante el taller. Incluya casos donde es posible asignarlo, e incluya otros donde no sea posible. Para facilitarlo, puede crear su propia excepción en caso de que no se pueda asignar un animal a una jaula.
  3. Extienda su aplicación para que pueda usarse desde consola. Ésta debe permitir:
    1. Visualizar las jaulas disponibles.
    2. Agregar un animal a la jaula.
    3. Comparar la edad de los animales de dos jaulas.
  4. En el archivo README.txt describa los casos de prueba tuvo en cuenta.
  5. Cargue el taller a su repositorio en Bitbucket. No olvide crear el archivo calificacion.txt