Ai-je correctement implémenté equals et hashCode avec Google Guava?

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 .