2012-04-09 7 views
6

Tengo el siguiente código que anula los métodos equals() y hashcode().¿se pueden usar getters en iguales y hashcode?

public boolean equals(Object obj) 
{ 
    if (obj == null) 
    return false; 
    if (!(obj instanceof Name)) 
    return false; 
    Name name = (Name) obj; 
    return this.name.equals(name.name); 
} 

public int hashCode() 
{ 
    return name.hashCode(); 
} 

aquí puedo reemplazar por debajo de 2 líneas:

return this.name.equals(name.name); 
return name.hashCode(); 

con

return this.getName().equals(name.getName()); 
return getName().hashCode(); 

quiero decir en lugar de utilizar las propiedades puedo utilizar directamente en el interior es igual captadores y métodos hashcode?

Gracias!

+0

y ¿por qué no?:) –

+0

sí, no hay ningún problema. – MJM

+0

sí. Simplemente no puede usar arreglos o campos que pueden modificarse cuando el objeto está en una colección. –

Respuesta

1

Puede, pero ¿por qué lo haría? Opción A: el compilador lo indica, por lo que terminará con una referencia al campo de todos modos. Opción B: el compilador no alinea la llamada, es decir, ha introducido una llamada de método adicional.

También hay implicaciones para la legibilidad: si el campo name es directamente accesible dentro de la clase, ¿por qué no consultarlo directamente? Encuentro esto más fácil de leer, pero algunas personas lo encuentran inconsistente.

+0

Como una pequeña nota. Si usas Mokito, y te burlas de uno de los getters que se usan en equals y tu método equals es final, irás al infierno infinito. Mokito usa iguales internamente para burlarse de tus campos. Normalmente te sobrescribe iguales, pero si está marcado como final obtienes StackoverflowError – Lori

3

seguro de que podría utilizar esto,

hashcode() y equals() son los métodos de campo, pueden acceder directamente a los miembros privados, pero lo que si hay cierta lógica envuelta en método de acceso, por lo que siempre es seguro para el acceso campos que utilizan métodos de acceso

0

Sí, ¿por qué no podría?

En el futuro, con cosas como esta, te recomiendo que lo intentes y veas.

0

Sí, puedes. Por qué no? ¿Cuáles son tus dudas?

1

Sí, recomiendo usar getters en la implementación equals() & hashCode(). Y a lo mejor de mi conocimiento, esto no te perjudicará de ninguna manera.

La implementación de equals() sin getters no le dará el resultado correcto cuando compare dos objetos con proxy.

Ej: Si intenta comparar dos objetos devueltos por el proxy de su hibernación DAO subyacente, que nunca recibe cierto de su método equals(), aunque son los mismos objetos.

actualización

métodos getter Uso lugar de acceso directo. Esto se debe a que la instancia de objeto pasada como otra puede ser un objeto proxy, no la instancia real . Para inicializar este proxy, necesita acceder a él con un método getter .

Este es un extracto de Effective Java. Consulte this para obtener más información.

+0

Sé que esta es una vieja pregunta para responder, pero estoy seguro de que esto ayudará a alguien que trabaje con proxies. – Diablo

Cuestiones relacionadas