also ich fange mal von vorne an:
ich habe eine abstrakte Klasse Function, die eine mathematische Funktion x --> f(x) repäsentiert und wollte ihr die methode equals spendieren. nun ist mir aber aufgefallen, dass das nicht ganz einfach ist, da z.b. die beiden funktionen:
f(x) = x^2 * (3x+4) <--ein Produkt
g(x) = 3*x^3 + 4*x^2 <-- eine Summe
gleich sind, also sollte equals auf die beiden funktionen angewendet true ergeben. deswegen hab ich es mir leicht gemacht und definiere es einfach so: Zwei Funktionen sind genau dann gleich, wenn sie in den Funktionswerten an 3 zufällig gewählten Stellen im Intervall [-100;100] übereinstimmen. sollte eigentlich in 99,9% aller Fälle klappen, nur jetzt kommt das Problem mit der Konsistenz von equals() und hashCode(). ich muss ja auch hashCode() überschreiben, sodass 2 Funktionen die laut equals() gleich sind auch den selben hashCode() zurückgeben. hier habe ich es mir wieder einfach gemacht und habe die methode hashCode() einfach folgendermaßen überschrieben:
klappt natürlich, aber jetzt meine frage: wann ist es denn relevant, dass hashCode() "vernünftige" werte zurückgibt?
PS: um die funktionen zu repräsentieren benutze ich übrigens das Composite Pattern (abstrakte Klasse Function mit den methoden getValue(double x) und getDerivate(), dann viele Klassen die von ihr erben, wie z.b. Konstante, Potenzfunktion, Summe, Produkt, Verkettung, etc., aus denen ich dann funktionen zusammensetzen kann.). vielleicht hat ja jmd eine idee wie ich equals() anders realisieren könnte als mit dem "Zufallsverfahren"?
ich habe eine abstrakte Klasse Function, die eine mathematische Funktion x --> f(x) repäsentiert und wollte ihr die methode equals spendieren. nun ist mir aber aufgefallen, dass das nicht ganz einfach ist, da z.b. die beiden funktionen:
f(x) = x^2 * (3x+4) <--ein Produkt
g(x) = 3*x^3 + 4*x^2 <-- eine Summe
gleich sind, also sollte equals auf die beiden funktionen angewendet true ergeben. deswegen hab ich es mir leicht gemacht und definiere es einfach so: Zwei Funktionen sind genau dann gleich, wenn sie in den Funktionswerten an 3 zufällig gewählten Stellen im Intervall [-100;100] übereinstimmen. sollte eigentlich in 99,9% aller Fälle klappen, nur jetzt kommt das Problem mit der Konsistenz von equals() und hashCode(). ich muss ja auch hashCode() überschreiben, sodass 2 Funktionen die laut equals() gleich sind auch den selben hashCode() zurückgeben. hier habe ich es mir wieder einfach gemacht und habe die methode hashCode() einfach folgendermaßen überschrieben:
Code:
public int hashCode(){
return 1;
}
PS: um die funktionen zu repräsentieren benutze ich übrigens das Composite Pattern (abstrakte Klasse Function mit den methoden getValue(double x) und getDerivate(), dann viele Klassen die von ihr erben, wie z.b. Konstante, Potenzfunktion, Summe, Produkt, Verkettung, etc., aus denen ich dann funktionen zusammensetzen kann.). vielleicht hat ja jmd eine idee wie ich equals() anders realisieren könnte als mit dem "Zufallsverfahren"?