Wie hashcodes für enums entsprechen in Java, und die Kombination von enum-hashCodes für eine HashMap key

Habe ich eine Klasse, die enthält verschiedene Enumerationen, die (verschiedenen Arten). Diese Klasse dient als Schlüssel für eine HashMap. Die Klassen hashCode derzeit umgesetzt wird, wie diese:

  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 ...
  }

Nun, wenn enums hashCode würde nur wieder den index des enum-Wert in der enum-definition, wäre dies nicht optimal sein (zu viele Auseinandersetzungen). Die Methode definition für Enum.hashCode() ist diese:

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

Vorausgesetzt, diese Delegierten zu Object.hashCode(), sollte alles in Ordnung sein, weil für jede enum-Konstante es existiert nur eine Instanz, und Object.hashCode() wird in der Theorie so etwas wie eine integer abgeleitet von der internen Adresse des Objekts. Bin ich im Recht?

PS: natürlich wird es etwas komplexer, wenn die gleichen enum verwendet wird mehrmals in einem Schlüssel.

Es kann nicht delegieren, um etwas anderes als das Objekt.hashCode(), die als Enum extends Object. Es ist schwer zu sehen, wie das ist eine echte Frage.
Sind Sie rechts? Ich bin sicher, Sie können leicht selbst überprüfen, indem Sie anrufen myEnum.ordinal() und myEnum.hashCode() und Vergleich der Ergebnisse.

InformationsquelleAutor Axel | 2012-11-27

Schreibe einen Kommentar