miércoles, 5 de mayo de 2010

implementando las funciones hashCode y equals con generics en java

En la entrada anterior, se mostro como implementar la funcion equals y hashCode, utilizando una clase especifica (String), sin embago, es posible implementar la funcionalidad anteriormente descrita, utilizando generics de java, funcionalidad introducida en la version 1.5 (5.0).




01: package test;
02: 
03: public abstract class GenericsBean<T> {
04: 
05:         T id;
06: 
07:         @Override
08:         public int hashCode() {
09:                 return id.hashCode();
10:         }
11: 
12:         @SuppressWarnings("unchecked")
13:         @Override
14:         public boolean equals(Object obj) {
15:                 return this == obj
16:                                 || (obj instanceof GenericsBean && equals0((GenericsBean<T>) obj));
17:         }
18: 
19:         public boolean equals(GenericsBean other) {
20:                 return this == other || equals0(other);
21:         }
22: 
23:         protected boolean equals0(GenericsBean other) {
24:                 return this.id.equals(other.id);
25:         }
26: 
27:         public T getId() {
28:                 return id;
29:         }
30: 
31:         public void setId(T id) {
32:                 this.id = id;
33:         }
34: 
35: }
36: 
Explicacion:

03-03: Se define la clase "parametrizada" que se empleara para definir el id del bean. Esta clase del id, puede ser incluso un id compuesto (un bean) y no solo un tipo nativo (Integer, Long, String, etc).
07-10: Se define el hashCode, utiilzando el hashCode del objeto id. A esta funcion se le agrega la anotacion @SuppressWarnings("unchecked"), para que el compilador no muestre mensajes de alerta debido a la conversion de un tipo "Generico".
19-21: Definicion de equals, para comparar contra un objeto cualquiera.
23-25: Definicion de la funcion equals0, la cual utiliza el equals del id.

Optimizacion:
  1. La utilizacion de este codigo, ayuda a no definir estas funciones en cada ocasion. La mayor desventaja, radica en que no es posible cambiarle el nombre al atributo id.
Actualizacion:
  • Se suprime el private en el id, para permitir acceso "friend"

No hay comentarios.:

Publicar un comentario