| 

.NET C# Java Javascript Exception

2
Jede Java-Klasse macht eine hashCode-Eigenschaft verfügbar, die über die Klasse java.lang.Object vererbt wird, aber auch benutzerdefiniert überschrieben werden kann. Wie mache ich sowas praktisch und kann ich den Standarddatentyp (Ganzzahl) für die überschriebene Eigenschaft auch anpassen?
18.04.2012
ananth3125 61 2
1 Antwort
0
Also zunächst: hashCode() ist eine Methode, keine Eigenschaft.

Der Typ des Ergebnisses einer Methode läßt sich beim Überschreiben nur in Richtung einer Spezialisierung verändern - d.h. wenn die Methode Typ A zurückgibt, kannst Du beim Überschreiben A oder eine von A abgeleitete Klasse als Ergebnistyp festlegen. Da es aber nicht möglich ist, von int abzuleiten, steht diese Möglichkeit für hashCode() nicht offen.

Gute hashCode()-Implementierungen bieten - neben der Einhaltung der in der Doku vorgegebenen Regeln natürlich - eine möglichst gute "Streuung" der einzelnen Codes und eine möglichst kurze Antwortzeit. Es gibt dafür keinen universellen Ansatz, aber bewährt hat sich z.B., die einzelnen Hash-Codes aller der Felder zu kombinieren, die bei der Beantwortung der Frage berücksichtigt werden, ob zwei Instanzen der Klasse "gleich" sind - die also in der equals()-Methode berücksichtigt werden. Ist ein Feld von einem Typ, der selbst keine gute hashCode()-Implementierung hat, so mußt Du eine individuelle Lösung finden unter Berücksichtigung des Wissens darüber, welche Werte dieser Typ annehmen kann und wie diese verteilt sind. Das Ziel sollte eben sein, für die tatsächlich auftretenden Werte auf möglichst viele verschiedene Hash-Codes zu kommen (für alle Werte den selben Hash zu liefern, wäre zwar eine gültige und obendrein für sich genommen unschlagbar schnelle Lösung, die aber die Performance der auf Hashes basierenden Container in den Keller schicken würde).
Weitere Überlegungen dazu und Vorschläge, wie sich einzelnen Hash-Codes kombinieren lassen, findest Du zum Beispiel hier und hier.
18.04.2012
Matthias Hlawatsch 13,2k 4 9

Stelle deine Java-Frage jetzt!