Problème de stabilité des hashcode sur des même Enum en Java

J’ai récemment eu un problème, dans lequel deux serveurs « concurrents » (mais avec la même application) me renvoyaient un flux avec des objets qu’un hashcode de ceux-ci. Hors pour un même objet, je me retrouvais avec deux hashcodes différents.

Après pas mal de recherche, j’ai fini par me rendre compte que le problème venait lui-même du hashcode de l’enum que contenait les objets, et à partir duquel (entre autres) était produit l’énum de l’objet.

Pire, à chaque redémarrage des serveur, les hashcodes changeaient ! Donc il semblait que le hashcode dépendait du serveur et changeait à chaque redémarrage.

En fait, c’est bien ça. Contrairement à d’autres ojects plus simple, les hashCode d’enum sont des méthodes prenant en plus de la simple valeur de l’énum une valeur (un « salt » en quelque sorte) qui est différents à chaque démarrage d’instance de java (en fait cette valeur dépend de l’adresse mémoire de l’instance) :

The method hashCode() in class Enum is final and defined as super.hashCode(), which means it returns a number based on the address of the instance, which is a random number from programmers POV.

Trouvé .

Evidemment, pas moyen d’overrider le HashCode() de la classe d’énum, car cette méthode est finale pour les énums. La seule possibilité, à mes yeux : faire un this.name().hashCode() car le name d’un Enum est unique, et que c’est un String, donc son hashCode est déterministe.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.