Как написать метод равенства на Java

Рассмотрите возможность добавления метода равенства к следующему классу простых точек:

public 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;
    }

    // ...
}

// мое определение equals

public boolean equals(Point other) {
  return (this.getX() == other.getX() && this.getY() == other.getY());
}

Что не так с этим методом ? На первый взгляд кажется, что все работает нормально:

Point p1 = new Point(1, 2);
Point p2 = new Point(1, 2);

Point q = new Point(2, 3);

System.out.println(p1.equals(p2)); // prints true

System.out.println(p1.equals(q)); // prints false

Однако проблемы начинаются, когда вы начинаете помещать точки в коллекцию:

import java.util.HashSet;

HashSet<Point> coll = new HashSet<Point>();
coll.add(p1);

System.out.println(coll.contains(p2)); // prints false

Как может быть так, что coll не содержит p2, даже если к нему был добавлен p1, а p1 и p2 - это равные объекты?

5
задан Milan Mendpara 31 January 2012 в 16:13
поделиться