viernes, 16 de enero de 2009

Entender la sobreescritura de metodos 2: sobreescribir equals()

Cómo mantener información de usuario utilizando el objeto session
(y con ello Demostración de llamadas a métodos de la clase java.lang.Object: equals y hascode en relación al uso de colecciones
)


Para la siguiente demostración vamos a crear una discoteca: programa para coleccionar discos.
La funcionalidad va a consistir en 2 paginas web o URLs. Una pagina o peticion(/discoteca) para mostrar el contenido de los discos almacenados en la coleccion del usuario (para almacenar objetos de tipo disco vamos a utilizar la clase java.util.List). Otra pagina o solicitud para (/disco) para mostrar formulario de incluir nuevo disco.

Comenzamos definiendo la clase Disco con las propiedades: titulo, cantante y referencia.

Seguimos con el formulario de nuevo disco que se enviara a la discoteca...
Es decir creamos un nuevo servlet que pintará el formulario y lo damos de alta en el web.xml para que escuche las peticiones en /disco


Creamos el servlet discoteca y lo damos de alta en el web.xml.
El servlet discoteca en esta primera fase de desarrollo, lo unico que hace es comprobar que la discoteca (List ) esta en la session y en caso contrario la crea. Posteriormente la pinta en pantalla (aunque por ahora siempre estará vacía)

En dicho servlet accedemos al objeto session (HttpSession) a través del objeto request.getSession(), obteniendo con este objeto la capacidad de acceder a atributos session.getAttribute("clave") o incluir atributos session.setAttribute("clave", objeto).


Una vez que esto funciona, modificamos el codigo para que: si recibimos el formulario de /disco entonces creamos un nuevo Disco y lo metemos en la coleccion.

Sobreescribimos el metodo toString() de la clase Disco para que imprima el nombre y autor del disco



Limitamos los discos duplicados (implementamos metodo equals y hascode en la clase Disco) para poder utilizar el metodo de la clase List contains: boolean existe=coleccion.contains(object)

Ejercicio: zoo.
Paquete es.cea.zoo
Para practicar los conceptos anteriores: atributos de session, servlets, sobreescritura de metodos (equals y tostring) vamos a realizar un programa para la gestion de un zoologico...
  1. Creamos en eclipse un nuevo proyecto web dinamico. Como nombre le indicamos "zoo"
  2. seleccionamos la pestañita de "servers" dentro de eclipse y boton derecho ->add and remove projects... y le añadimos el recien creado
  3. Los animales que tendremos que gestionar en el zoo serán: leones, jirafas, panteras. Cada animal tendra un nombre y una edad
  4. Creamos un servlet que responda a la peticion "/visita" y nos pinte en pantalla la coleccion de leones, de jirafas y de panteras (en tres lineas, una debajo de la otra)
  5. Creamos un servlet que pinte un formulario para introducir una nueva jirafa en la URL: '/jirafa', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  6. Creamos un servlet que pinte un formulario para introducir una nueva pantera en la URL: '/pantera', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  7. Creamos un servlet que pinte un formulario para introducir un nuevo leon en la URL: '/leon', con los datos: nombre y edad. Dicho formulario se enviará a '/visita'
  8. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/jirafa', entonces creará una nueva jirafa y la incluira a la coleccion de jirafas existentes
  9. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/pantera', entonces creará una nueva pantera y la incluira a la coleccion de panteras existentes
  10. Cuando el servlet encargado del URL: '/visita' reciba los parametros del formulario '/leon', entonces creará un nuevo leon y lo incluira a la coleccion de leones existentes
  11. Modificar el metodo equals de las clases correspondientes (Leon, Jirafa, Pantera) para que al incluirlas a la coleccion no existan duplicados [dos animales se consideran iguales si su nombre y edad es igual*]
  12. aplicar herencia entre las diferentes clases de animales para eliminar el codigo redundante



más sobre la clase Object


En java todo es un objeto! (excepto los tipos primitivos)

Java es un lenguaje orientado a objetos porque existe una herencia "invisible" (sin declarar de forma especifica) de la clase java.lang.Object . Esto quiere decir que todas nuestras clases heredan de la clase java.lang.Object, y con ella 5 de los metodos que declara:
  • clone()
  • equals(Object)
  • finalize()
  • hascode()
  • toString()

Ya hemos visto como sobreescribir el comportamiento del metodo toString() en la entrada anterior, y ahora vamos a cambiar el comportamiento del metodo equals(Object).
Este metodo esta diseñado para saber si un objeto es igual a otro objeto. Un ejemplo de esto sería con cadenas de texto:
String una="ejemplo";
String dos="ejemplo2";
String unaBis="ejemplo";

una.equals(dos)==false
una.equals(unaBis)==true

Este comportamiento sería el esperado, pero si lo probamos en objetos que no son de tipo String entonces comprobaremos que el metodo equals no responde a nuestras expectativas...
http://code.google.com/p/cursoj2ee/source/detail?r=15

En el ejemplo anterior se pone de manifiesto que dos alumnos con el mismo nombre e igual DNI no son iguales como objeto. Es decir al compararlos con equals nos devuelve false.
La razón de ello es que la comparación de objetos no se realiza por sus propiedades sino por la implementación del metodo equals en la clase correspondiente. Si no sobreescribimos el metodo equals dos objetos (obtenidos con new ClaseDeObjeto()) nunca son iguales aunque sus propiedades sean iguales.


Diferencias entre igualdad e identidad
boolean iguales=a.equals(b);
boolean identicos=(a == b);

5dia

No hay comentarios:

Publicar un comentario