java - implementar - ¿Es posible hacer que eclipse genere hashCode y se iguala con HashCodeBuilder e EqualsBuilder?
object hashcode java (6)
Puede hacerlo con Plantillas de código en Eclipse.
Aquí hay una solución que encontré con ejemplos de HashCodeBuilder y EqualsBuilder.
Plantilla EqualsBuilder:
public boolean equals(Object o) {
boolean result = false;
if (this == o) {
result = true;
} else if (o instanceof $CLASSNAME$) {
$CLASSNAME$ other = ($CLASSNAME$) o;
result = new org.apache.commons.lang.builder.EqualsBuilder()
.append($END$
.isEquals();
}
return result;
}
Plantilla HashCodeBuilder:
public int hashCode() {
return new org.apache.commons.lang.builder.HashCodeBuilder()
.append( $END$ )
.toHashCode();
}
El hashCode generado por defecto y las implementaciones equivalentes son feas en el mejor de los casos.
¿Es posible hacer que eclipse genere desde HashCodeBuilder y EqualsBuilder, y quizás incluso un toString con ToStringBuilder?
Uso el plugin de Eclipse llamado "Commonclipse"
Después de la instalación, verá un nuevo elemento del menú contextual "commonclipse" cuando haga clic derecho dentro de un archivo fuente java. Puede generar métodos equals, hashcode, toString y compareTo basados en las bibliotecas de Apache commons.
Para instalarlo, use esto desde dentro de la actualización de eclipse: http://commonclipse.sourceforge.net
Eche un vistazo a Commons4E
No se ha actualizado en un tiempo, pero entonces no creo que deba cambiar mucho?
Actualización: acaba de verificar contra 3.4.1 y funciona bien.
Plantillas de código de Eclipse para eclipse 3.5.0, derivadas de las plantillas de Bruno Conde:
@Override
public boolean equals(Object obj) {
if (obj == null) {
return false;
} else if (obj == this) {
return true;
} else if (obj.getClass() != this.getClass()) {
return false;
}
${enclosing_type} other = (${enclosing_type}) obj;
return new EqualsBuilder()//
.appendSuper(super.equals(other))//
.append(${cursor})//
.isEquals();
}
y
@Override
public int hashCode() {
return new HashCodeBuilder(${cursor})//
.append()//
.toHashCode();
}
Puede configurar Eclipse para generar toString()
usando un generador personalizado. En nuestro caso ToStringBuilder
de Apache Commons Lang . Puede ver aquí http://azagorneanu.blogspot.com/2011/08/how-to-generate-equals-hashcode.html cómo hacerlo.
Esa publicación de blog también contiene plantillas de Eclipse para generar equals()
, hashCode()
y compareTo()
usando constructores Apache Commons Lang.
Hice esta plantilla revisando varias respuestas, sitios web y probándola en Eclipse Luna. Vaya a Windows-> Preferencias y luego a Java-> Editor-> Plantillas y agréguela allí.
${:import(org.apache.commons.lang3.builder.HashCodeBuilder, org.apache.commons.lang3.builder.EqualsBuilder)}
@Override
public int hashCode() {
HashCodeBuilder hashCodeBuilder = new HashCodeBuilder();
hashCodeBuilder.append(${field1:field});
hashCodeBuilder.append(${field2:field});
hashCodeBuilder.append(${field3:field});
hashCodeBuilder.append(${field4:field});
hashCodeBuilder.append(${field5:field});
return hashCodeBuilder.toHashCode();
}
@Override
public boolean equals(Object obj) {
if (this == obj) {
return true;
}
if (obj == null) {
return false;
}
if (getClass() != obj.getClass()) {
return false;
}
${enclosing_type} rhs = (${enclosing_type}) obj;
EqualsBuilder equalsBuilder = new EqualsBuilder();
equalsBuilder.append(${field1}, rhs.${field1});
equalsBuilder.append(${field2}, rhs.${field2});
equalsBuilder.append(${field3}, rhs.${field3});
equalsBuilder.append(${field4}, rhs.${field4});
equalsBuilder.append(${field5}, rhs.${field5});${cursor}
return equalsBuilder.isEquals();
}