Требуется базовая справка по java equals () - PullRequest
1 голос
/ 23 ноября 2011

В настоящее время я работаю над простой линейной программой на Java. Фактического графического интерфейса пользователя не будет, поэтому он полностью основан на тексте.

Мы должны иметь класс точек и класс линий, которые включают объекты точек.

Проблема, с которой я столкнулся, заключалась в использовании метода equals для моего класса точек. Учитывая, что каждая точка имеет только два ПОЗИТИВНЫХ значения int, x и ay, и у меня возникают проблемы, я боюсь, что у меня будут проблемы, когда мне придется сравнивать линии, что будет включать сравнение точек, ширины int и цвет строки.

Вот как выглядит код моего метода equals для моего класса точек.

@Override
public boolean equals(Point that) {
    if(this==that)
        return true;
    //if
    if(this.x==that.getX() && this.y==that.getY())
        return true;
    return false;
}

Буду признателен за любую помощь.

Ответы [ 6 ]

4 голосов
/ 23 ноября 2011

Подпись должна содержать объект, а не точку.Затем вам понадобятся очевидные проверки, чтобы убедиться, что объект на самом деле является точкой и не ненулевым.

Кроме того, как вы указали, я не вижу проблем с методомнасколько я могу судить, это рефлексивно, симметрично, непротиворечиво и транзитивно.Если в вашем классе используются значения типа double, то я бы сказал, что при сравнении их нужно ввести дельта-значение, но очевидно, что с целочисленными значениями это не проблема.Точно так же, в противном случае вы можете столкнуться со странными проблемами при добавлении ваших точек в коллекции, которые используют hashcode() (согласно контракту они должны сравнивать объекты таким же образом).

1 голос
/ 23 ноября 2011

Для простого класса, содержащего только два целых числа, подходят следующие методы hashCode и equals:

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#hashCode()
 */
@Override
public int hashCode()
{
    final int prime = 31;
    int result = 1;
    result = prime * result + x;
    result = prime * result + y;
    return result;
}

/*
 * (non-Javadoc)
 * 
 * @see java.lang.Object#equals(java.lang.Object)
 */
@Override
public boolean equals(Object obj)
{
    if (this == obj)
        return true;
    if (obj == null)
        return false;
    if (getClass() != obj.getClass())
        return false;
    Point other = (Point) obj;
    if (x != other.x)
        return false;
    if (y != other.y)
        return false;
    return true;
}
0 голосов
/ 25 ноября 2016

Позвольте мне попробовать это:

@Override
public boolean equals(Object o) 
{
    //Cast the object o to Point instance
    if(!(o instanceof Point))
        return false;
    Point obj = (Point)o;
    if(obj==null)
        return false;//Checking if null
    else if.....//test properties using cast object obj
}
0 голосов
/ 23 ноября 2011

Посмотрите на определение метода Object.equals ().В частности, посмотрите на тип параметра.Любое переопределение equals () должно иметь параметр Object.

public boolean equals(Object that) { ... }
0 голосов
/ 23 ноября 2011

Ваш вопрос, похоже, касается производительности и метода Object.equals ().Вы должны прочитать это:

http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html#hashCode%28%29

Ваш класс должен переопределить метод hashCode ().

0 голосов
/ 23 ноября 2011

Вы показали, что метод Line класса равен, но я не думаю, что Line может равняться Point. Линия может содержать точку. Вы имели в виду метод «Точка равно»?

...