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ę.