Comment étendre HashCodeBuilder et EqualsBuilder

Comment étendre HashCodeBuilder et EqualsBuilder - Java - Programmation

Marsh Posté le 29-02-2012 à 17:56:32    

Bonjour,
 
Pour gérer mes les méthodes "hashCode()" et "equals()" de mes classes, je suis tombé sur HashCodeBuilder et EqualsBuilder (présents dans commons-lang.jar, package org.apache.commons.lang.builder).
 
J'ai vu qu'il était très facile de générer un hashCode en utilisant l'appel suivant :

Code :
  1. @Override
  2. public int hashCode() {
  3.  return HashCodeBuilder.reflectionHashCode(this);
  4. }


De ce que j'ai vu de la manière de fonctionner de cette méthode, elle créer un builder de type "HashCodeBuilder" et effetue une série d'appels aux méthodes "append()".
Or, je voudrais, pour certains de mes types, effectuer un append spécial. Mon idée principale était d'étendre "HashCodeBuilder" et d'ajouter mon append, comme suit :

Code :
  1. public class MonHashCodeBuilder extends HashCodeBuilder {
  2.  public MonHashCodeBuilder(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber) {
  3.   super(initialNonZeroOddNumber, multiplierNonZeroOddNumber);
  4.  }
  5.  public HashCodeBuilder append(MonType mt) {
  6.   // Traitement spécial
  7.  }
  8. }


Le problème est que la méthode static "HashCodeBuilder.reflectionHashCode()" créer un builder de type HashCodeBuilder et non pas MonHashCodeBuilder, voici le code source

Code :
  1. public static int reflectionHashCode(int initialNonZeroOddNumber, int multiplierNonZeroOddNumber, Object object,
  2.   boolean testTransients, Class reflectUpToClass, String[] excludeFields) {
  3.  if (object == null) {
  4.   throw new IllegalArgumentException("The object to build a hash code for must not be null" );
  5.  }
  6.  HashCodeBuilder builder = new HashCodeBuilder(initialNonZeroOddNumber, multiplierNonZeroOddNumber);
  7.  Class clazz = object.getClass();
  8.  reflectionAppend(object, clazz, builder, testTransients, excludeFields);
  9.  while (clazz.getSuperclass() != null && clazz != reflectUpToClass) {
  10.   clazz = clazz.getSuperclass();
  11.   reflectionAppend(object, clazz, builder, testTransients, excludeFields);
  12.  }
  13.  return builder.toHashCode();
  14. }


J'aurai pu surcharge cette méthode, mais le problème c'est que la méthode "reflectionAppend()" (lignes 9 et 12) est privée pour "HashCodeBuilder" (et la surcharger implique de surcharger tout un tas d'autres méthodes), et comme il n'y a pas moyen de passer le builder en argument je suis un peu bloqué.
 
Je pourrais aussi créer mon builder, et faire autant d'append que j'ai d'attributs, mais je perds dans ce cas l'intérêt de la méthode simple.
 
J'ai le même problème pour EqualsBuilder.
 
Si vous avez des idées, je suis preneur.
Merci d'avance :)
 

Reply

Marsh Posté le 29-02-2012 à 17:56:32   

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed