Comment les codes de hachage pour les énumérations sont-ils calculés en Java, et en combinant enum hashCodes pour une clé de HashMap?

J'ai une classe qui contient différentes énumérations (les différents types). Cette classe est utilisé comme clé pour un HashMap. Les classes hashCode est actuellement mis en œuvre comme ceci:

  public static class Key implements Comparable<Key> {
    final int a;
    final Enum1 enum1;
    final Enum2 enum2;

    @Override
    public int hashCode() {
      return a ^ enum1.hashCode() ^ enum2.hashCode();
    }

    //... definition of equals and toString ...
  }

Maintenant, si les énumérations hashCode serait juste de retour de l'indice de la valeur d'enum dans l'enum définition, ce ne serait pas optimal (trop nombreux affrontements). La définition de la méthode pour Enum.hashCode() est-ce:

/**
 * Returns a hash code for this enum constant.
 *
 * @return a hash code for this enum constant.
 */
public final int hashCode() {
    return super.hashCode();
}

En supposant que cette délégués à Object.hashCode()tout devrait bien se passer parce que pour chaque constante enum il n'existe qu'un seul exemple, et Object.hashCode() sera, en théorie, être quelque chose comme un entier dérivée à partir de l'adresse interne de l'objet. Suis-je le droit?

PS: bien sûr, vous devrez utiliser quelque chose de plus complexe lorsque le même enum est utilisé plusieurs fois dans une clé.

source d'informationauteur Axel