2010-01-25 40 views
21

¿Cómo debo implementar hashCode() y equals() para la siguiente clase en Java?Cómo implementar hashCode y equivale al método

class Emp 
{ 
    int empid ; // unique across all the departments 
    String name; 
    String dept_name ; 
    String code ; // unique for the department 
} 
+0

Que hay código fuente de Java. ¿O creaste tu propia clase llamada 'cadena'? Y realmente debería echarle un vistazo a esto: http://java.sun.com/docs/codeconv/html/CodeConvTOC.doc.html –

+0

Veo que Joachim cambió un par de los errores en su muestra de código. Sin embargo, recomiendo mirar el enlace que publiqué en mi comentario anterior. –

+0

estoy usando la clase String de java – Vidya

Respuesta

30

en Eclipse derecha click-ratón> fuente -> generar hashCode() y equals() da esto:

/* (non-Javadoc) 
* @see java.lang.Object#hashCode() 
*/ 
@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + (code == null ? 0 : code.hashCode()); 
    return result; 
} 
/* (non-Javadoc) 
* @see java.lang.Object#equals(java.lang.Object) 
*/ 
@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (!(obj instanceof Emp)) 
     return false; 
    Emp other = (Emp) obj; 
    return code == null ? other.code == null : code.equals(other.code); 
} 

He seleccionado el código como un campo único

+1

Hmmm ... Por lo general, comparo todos los campos en el método equals() a menos que realmente tenga una razón sólida para no ... –

+1

Entonces, si dos 'Emp' de diferentes departamentos tienen el mismo código, ¿son iguales? Necesita al menos agregar 'dept_name' en esta implementación. –

+0

Estoy aceptando esta respuesta, ya que tengo la idea de lo que hay que hacer.jutky ha asumido el código como el identificador único. – Vidya

0

Si el código es único (es decir, su clave de negocio), lo mejor es usar sólo el código de iguales y hashCode - es una buena práctica de negocios clave independiente (código) de ID de objeto (id).

Aquí es una buena lectura: Hibernate Documentation: Equals and HashCode (válido no sólo para la hibernación en sí)

+1

Parece ser único para un departamento, por lo que sugiere que los departamentos puedan compartir el mismo "código". De todos modos, una pregunta bastante vaga si me preguntas. –

-1

cualquiera que sea el valor que use en igual para determinar si dos objetos son iguales, son los valores que necesita usar para crear un código hash.

public boolean equals(Object o) { 

    boolean result = false; 

    if(o instanceof CategoryEnum) { 

     CategoryEnum ce = (CategoryEnum) o; 
     result = ce.toString().equals(name); 

    }  
    return result; 

} 


public int hashCode() 
{ 
    int hash = 6; 
    hash += 32 * name.hashCode(); 
    return hash; 
} 
+2

(no -1 de mi parte) Eso no es completamente cierto. Es perfectamente legal usar solo un subconjunto para hashCode (por ejemplo, código y nombre para iguales y solo código para hashCode). Incluso es legal usar un hashCode constante ('public int hashCode() {return 42;}') - arruina el rendimiento de las colecciones hash (HashMap, HashSet, ...) pero siguen funcionando correctamente. Entonces es mejor que un método hashCode no válido. La única regla es: si dos objetos son iguales ('a.equals (b)'), deben tener el mismo código hash ('a.hashCode() == b.hashCode()'). Si no son iguales, los códigos hash aún pueden ser iguales. – sfussenegger

-2

equals() y hashcode(), Tienen muchos lugares diferentes. equals(), si no lo anulamos desde Object, ¿representa si dos variables apuntan al mismo montón de objetos?

public Class Student(){ 
    private int id; 
    private name; 
    public Student(int id,String name){ 
    this.name=name; 
    this.id=id; 
} 

public void main(String[] args){ 
    Student A=new Student(20,'Lily'); 
    Student B=new Student(20,'Lily'); 
    boolean flag=A.equals(B)//flag=flase; 
/* 
*Although they attribute the same, but they are two different objects, they point to  different memory 
*/ 


@Override 
public boolean equals(Object obj) { 


    if (obj == null) { 
    return false; 
    } 
    if (this == obj) { 
    return true; 
    } 

    if (this.getClass() != obj.getClass()) { 
    return false; 
    } 
    Student s=(Student)obj; 
    return new Integer(this.id).equals(new Integer(s.id))&&this.name.equals(s.name); 
    } 

/** 
    *Sometimes even though we Override the equals, but we still can not determine whether the *two objects the same, 
    *In the collection object, such as HashSet, this time we have to Override the hashoCode() 
    */ 

public int hashCode(){ 
    return id + name.hashCode() ; 
} 
3

probar este código, utilice org.apache.commons.lang3.builder

public int hashCode() { 
    return new HashCodeBuilder(17, 31). // two randomly chosen prime numbers 
     append(empid). 
     append(name). 
     append(dept_name). 
     append(code). 
     toHashCode(); 
} 

public boolean equals(Object obj) { 

    if (obj == this) 
     return true; 
    if (!(obj instanceof Person)) 
     return false; 

    Emp rhs = (Emp) obj; 
    return new EqualsBuilder(). 
     // if deriving: appendSuper(super.equals(obj)). 
     append(name, rhs.name). 
     isEquals(); 
} 
2

guayaba tiene métodos de ayuda para la creación de ellos. Usted le dice qué campos tomar en consideración y manejará nulos para usted y hará el cálculo del número primo para hashcode.

Los IDE también pueden generarlos según los campos que elijas.

La ventaja de delegarlo en una herramienta como esa es que obtienes una solución estándar y te preocupes menos por los errores y el mantenimiento de variadas implementaciones repartidas por todo tu proyecto.

He aquí un ejemplo del uso de la guayaba y la generada por un plugin de IntelliJ: https://plugins.jetbrains.com/plugin/7244?pr=

Cuestiones relacionadas