Commit e7f6ef9d authored by Christopher Schölzel's avatar Christopher Schölzel 🐃

fixes equals implementation for Point, Car and Fraction according to #2

parent a7b34d34
......@@ -53,6 +53,7 @@ include::{sourcedir}\equals.java[]
----
<1> Da der Parameter von `equals` vom Typ `Object` ist, muss zuerst geprüft werden ob es sich bei dem übergebenen Argument überhaupt um ein Objekt vom richtigen Typ handelt.
<2> Nachdem wir überprüft haben, dass das Objekt den richtigen Typ hat können wir es zu diesem Typ _casten_, um auf die relevanten Felder zugreifen zu können.
<3> Eine Grundregel von Java lautet "Wer `equals` sagt, muss auch `hashCode` sagen.". Überschreibt man die Funktionalität von `equals`, muss man gewährleisten, dass für zwei Objekte für die `x.equals(y)` den Wert `true` ergibt auch `x.hashCode() == y.hashCode()` gelten muss. Eine einfache Lösung dafür ist die Hilfsmethode `hash()` der Klasse `java.util.Objects`. An diese Methode müssen alle Objekte übergeben werden, die bei dem Vergleich relevant sind.
include::postDetails.adoc[]
== Mediaplayer
......
......@@ -6,11 +6,14 @@ class Point {
this.y = y;
}
public boolean equals(Object other) {
if (other instanceof Point) { // <1>
Point otherPoint = (Point) other; // <2>
return otherPoint.x == this.x && otherPoint.y == this.y;
}
return false;
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof Point)) return false; // <1>
Point otherPoint = (Point) other; // <2>
return otherPoint.x == this.x && otherPoint.y == this.y;
}
public int hashCode() {
return Objects.hash(x, y); // <3>
}
}
......@@ -20,11 +23,14 @@ class Car {
this.tachometer = tachometer;
}
public boolean equals(Object other) {
if (other instanceof Car) { // <1>
Car otherCar = (Car) other; // <2>
return otherCar.tachometer == this.tachometer;
}
return false;
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof Car)) return false; // <1>
Car otherCar = (Car) other; // <2>
return otherCar.tachometer == this.tachometer;
}
public int hashCode() {
return Objects.hash(tachometer); // <3>
}
}
......@@ -40,19 +46,26 @@ class Fraction {
this.denominator = denominator;
}
public boolean equals(Object other) {
if (other instanceof Fraction) { // <1>
Fraction otherFrac = (Fraction) other; // <2>
return otherFrac.numerator == this.numerator
&& otherFrac.denominator == this.denominator;
}
return false;
if (other == null) return false;
if (other == this) return true;
if (!(other instanceof Fraction)) return false; // <1>
Fraction otherFrac = (Fraction) other; // <2>
return otherFrac.numerator == this.numerator
&& otherFrac.denominator == this.denominator;
}
public int hashCode() {
return Objects.hash(numerator, denominator); // <3>
}
}
assert !new Fraction(1,2).equals(new Car(123.0));
assert new Fraction(1,2).equals(new Fraction(1,2));
assert new Fraction(1,2).hashCode() == new Fraction(1,2).hashCode();
assert new Fraction(2).equals(new Fraction(2,1));
assert new Fraction(2).hashCode() == new Fraction(2, 1).hashCode();
assert !new Car(12).equals(new Car(12.1));
assert new Car(12).equals(new Car(12.0));
assert new Car(2).hashCode() == new Car(2).hashCode();
assert !new Point(3,4).equals(new Point(4,3));
assert new Point(3,4).equals(new Point(3,4));
assert new Point(3,4).hashCode() == new Point(3,4).hashCode();
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment