J’utilise Hibernate et j’ai besoin de remplacer Equals et hashCode (). J’ai choisi d’utiliser les assistants de google-guava et de hashCode.
Je voulais savoir si quelque chose me manque ici.
J’ai get / set méthodes pour idImage et filePath .
@Entity @Table(name = "IMAGE") public class ImageEntity { private Integer idImage; private Ssortingng filePath; @Override public int hashCode() { return Objects.hashCode(getFilePath()); } @Override public boolean equals(final Object obj) { if(obj == this) return true; if(obj == null) return false; if(obj instanceof ImageEntity){ final ImageEntity otherImage = (ImageEntity) obj; return Objects.equal(getFilePath(), otherImage.getFilePath()); } return false; } }
MODIFIER:
A couru dans l’inheritance et avoir un échantillon ici
Le problème avec l’opérateur instanceof
est qu’il fonctionne en tenant compte du polymorphism, si je puis dire.
Disons, par exemple, que vous faites ceci:
public class AdvancedImageEntity extends ImageEntity { //some code here }
et ensuite vous faites ceci:
ImageEntity ie = new ImageEntity (); AdvancedImageEntity advanced_ie = new AdvancedImageEntity (); boolean this_will_be_true = ie.equals (advanced_ie);
Comme son nom l’indique, cet appel equals
retournera true, à cause de l’opérateur instanceof
.
Je sais que cela ressemble à un truc de base et que la plupart des gens le savent, mais c’est tellement facile de l’oublier. Maintenant, si vous voulez ce comportement, alors tout va bien, vous avez correctement implémenté l’ equals
. Mais si vous considérez qu’un object ImageEntity
ne doit pas être égal à un object (hypothétique) AdvancedImageEntity
, déclarez soit ImageEntity
comme final
soit oubliez instanceof
et implémentez votre méthode equals
comme ceci:
@Override public boolean equals(final Object obj) { if(obj == this) return true; if(obj == null) return false; if (getClass ().equals (obj.getClass ())) { final ImageEntity otherImage = (ImageEntity) obj; return Object.equals (getFilePath(), otherImage.getFilePath()); } return false; }
Cela vérifiera le type réel de l’object, quel que soit le type de référence. Si le paramètre obj
est une instance d’une sous-classe, il “glissera” par instanceof
of. Mais getClass
est beaucoup plus ssortingct et ne le permet pas.
PS: Je ne dis pas que cela est mauvais et ne devrait pas être utilisé. Je dis simplement que vous devez être au courant de cette situation particulière et décider de l’utiliser en tenant compte de cela.
Vous pouvez réellement utiliser Guava EqualsTester pour tester votre implémentation equals et hashCode:
new EqualsTester() .addEqualityGroup("hello", "h" + "ello") .addEqualityGroup("world", "wor" + "ld") .addEqualityGroup(2, 1 + 1) .testEquals();
C’est dans la testlib goyave.
com.google.guava guava-testlib test
Changement mineur dans votre implémentation:
@Override public boolean equals(final Object obj) { if(obj == this) return true; return obj instanceof ImageEntity && Objects.equal(getFilePath(), ((ImageEntity) obj).getFilePath()); }
C’est bon comme c’est. Bien que instanceof rend le contrôle nul inutile.
De plus, je pense que c’est bien d’utiliser des identifiants générés automatiquement, bien que cela soit très discutable .