miércoles, 5 de mayo de 2010

implementando las funciones hashCode y equals en java

Creando una clase bean, necesita implementar las funciones equals y hashCode, no es necesario recurrir a algoritmos complejos y cripticos. El ejemplo siguiente implementa las funciones equals y hashCode, haciendolas simples, aprovechando funciones existentes.




01: package test;
02: 
03: public class Bean {
04: 
05:         private String key;
06: 
07:         @Override
08:         public int hashCode() {
09:                 return key.hashCode();
10:         }
11: 
12:         protected boolean equals0(Bean bean) {
13:                 return key.equals(bean.key);
14:         }
15: 
16:         @Override
17:         public boolean equals(Object obj) {
18:                 return this == obj || (obj instanceof Bean && equals0((Bean) obj));
19:         }
20: 
21:         public boolean equals(Bean bean) {
22:                 return this == bean || equals0(bean);
23:         }
24: 
25:         public String getKey() {
26:                 return key;
27:         }
28: 
29:         public void setKey(String key) {
30:                 this.key = key;
31:         }
32: 
33: }
34: 



En este ejemplo en particular, se utilizan las funciones existentes hashCode de la clase String y equals de la misma clase.

Explicacion:

07-10: Se emplea la funcion hashCode de la clase String, para generar el hashCode de la clase Bean.
12-14: Se implementa una funcion equals0, utilizando la funcion equals de la clase String. Esta clase define la funcionalidad basica de la funcion equals de la clase Object.
16-19: En la implementacion de la funcion equals, se emplea la funcion equals0 definida previamente y verificando el caso en que se trata del mismo objeto.
21-23: Esta funcion se define, para verificar la igualdad entre objetos del mismo tipo
25- 31: Definicion de getters y setters propios de la clase.

Optimizacion:
  1. Uso de las funciones propias de String. Particularmente al definir la funcion hashCode. Esto mismo se puede implementar utilizando las funciones equivalentes de las clases Integer, Float, Double o cualquier otra que encapsule a un tipo nativo dentro del paquete java.lang
  2. Las funciones equals primero determinan si se trata del mismo objeto, antes de intentar comparar cualquier propiedad o atributo.
  3. Evitar la ejecucion del operador instanceof, en la medida de lo posible, al implementar 2 funciones equals, una generica, que recibe un parametro del tipo Object (linea 17) y una funcion especifica para objetos de la misma clase (linea 21). El mayor problema de estas funciones, radica en su resolucion, pues solo es posible optimizar en tiempo de ejecucion o por medio del uso de Reflection

2 comentarios: