Java Slayer – Equals Slayer
Dziś bolą mnie zęby i jako, że chodzę podtruty zatem będzie wesoły slayer.
W aplikacji mamy dwa rodzaje punktów. Pierwsze to punkty, drugi to punkty kolorowe. Założenie jest takie, że jeżeli porównujemy punkt kolorowy ze zwykłym to porównujemy je jako zwykłe punkty. Pytanie na dziś co robi poniższy kod i dlaczego tak, a nie inaczej?
Listing 1. Java Slayer – Equals Slayer
package pl.koziolekweb.slayer;
import java.awt.Color;
public class EqualsSlayer {
public static void main(String[] args) {
Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);
ColorPoint p3 = new ColorPoint(1, 2, Color.BLACK);
ColorPoint p4 = new ColorPoint(1, 2, Color.RED);
System.out.println(p1.equals(p2));
System.out.println(p3.equals(p4));
System.out.println(p1.equals(p3));
System.out.println(p3.equals(p1));
}
}
class Point {
private final int x;
private final int y;
public Point(int x, int y) {
this.x = x;
this.y = y;
}
public int getX() {
return x;
}
public int getY() {
return y;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Point))
return false;
Point p = (Point) obj;
return this.x == p.x && this.y == p.y;
}
@Override
public int hashCode() {
int ret = 17;
ret = 31 * ret + x;
ret = 31 * ret + y;
return ret;
}
}
class ColorPoint extends Point {
private final Color color;
public ColorPoint(int x, int y, Color color) {
super(x, y);
this.color = color;
}
public Color getColor() {
return color;
}
@Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (!(obj instanceof Point))
return false;
if (obj instanceof Point)
return super.equals(obj);
ColorPoint p = (ColorPoint) obj;
return super.equals(obj) && this.color.equals(p.color);
}
@Override
public int hashCode() {
return 31 * super.hashCode() + color.hashCode();
}
}
Odpowiedź w sobotę.
Kod jest dostępny na licencji MIT. Jednak niektóre rozwiązania mogą być objęte inną licencją. W takim przypadku jest, to zaznaczone. Artykuły są dostępne na licencji CC-BY.
Jeżeli spodobał ci się ten wpis, to podziel się nim z innymi lub wesprzyj autora.