Angenommen, ich habe eine Klasse, in der alle Instanzen gleich sind. Ein typischer Anwendungsfall ist für Klassen, die keinen Zustand haben, sondern sich nur als Funktionen verhalten. JetztHashCode-Implementierung für die Klasse, deren Instanzen alle gleich sind
public class ToStringFunction implements Function<Object, String> {
@Override
public String apply(Object o) {
return o.toString();
}
@Override
public boolean equals(Object o) {
return o instanceof ToStringFunction;
}
}
, wie sollte man eine Methode hashCode implementieren? Natürlich muss es ein konstanter Wert sein, um den equals/hashCode-Vertrag zu erfüllen. Aber welchen Wert sollte das haben? Wenn ein trivialer Wert wie 0 oder 1 verwendet wird, kann dies zu Kollisionen mit anderen ähnlichen Klassen führen.
So scheint es, dass dies auf die Frage läuft: , wie ein Hash-Code, der wahrscheinlich für eine bestimmte Klasse, aber das gleiche für alle seine Instanzen identisch ist zu implementieren.
Ich kam mit diesen beiden Ideen. Was denkst du, sind sie gesund?
@Override
public int hashCode() {
return ToStringFunction.class.hashCode();
}
@Override
public int hashCode() {
return "ToStringFunction".hashCode();
}
Der klassenbasierte Ansatz sieht gut aus für mich ... Aber wofür brauchen Sie equals/hashCode, wenn ich fragen darf? – fge
Ich denke, Sie müssen keine Objekte in einen Satz setzen, wenn sie keinen Zustand haben nur Funktionen. – gyorgyabraham
Ich habe keinen konkreten Anwendungsfall, aber ich nehme an, Sie möchten möglicherweise eine Reihe von Operationen, die Sie auf einige Daten anwenden möchten. Zum Beispiel definiert der JDK Comparator in seiner Schnittstelle equals: http://docs.oracle.com/javase/7/docs/api/java/util/Comparator.html – Natix