2010-10-16 1 views
3

Я пытаюсь написать равенства метод для объектов, сравнивает их поля, и если они равны, то верно:Равно метод для объектов

public boolean equals(Ghost other){ 
     if (this.x == other.x && this.y == other.y && this.direction==other.direction && this.color==other.color) 
        return true; 
        else 
        return false; 
} 

Что бы случилось с этим?

+1

@fprime: Вам нужен только один оператор return, а не 'if'. ;-) –

+1

распечатать результат отдельных фраз (например, 'this.x == other.x') перед выражением if. Посмотрите, какой из них не работает. –

+0

Рассматриваются ли какие-либо из переменных типов объектов, в отличие от примитивных типов? –

ответ

7

Я посмотрел one of your previous questions, и кажется, что поле color является Color. Я предполагаю, что вы не изменили тип этого поля.

Это класс и, следовательно, ссылочный тип, что означает, что вам нужно использовать equals() или аналогичный метод для сравнения цветов (я раньше не использовал этот класс, поэтому я не могу точно сказать, какой метод использования).

if (/* ... && */ this.color.equals(other.color)) { 

Как и в комментариях, используя == сравнивать ссылочные типы действительно сравнения адресов памяти в Java. Он возвращает только true, если они оба относятся к одному и тому же объекту в памяти.


EDIT:akf points out, что вам нужно использовать базовый класс Object для параметра, в противном случае вы не перекрывая Object.equals(), но на самом деле перегрузки его, т.е. обеспечивая другой способ вызова одноименных метода , Если вы случайно случайно передадите объект совершенно другого класса, может возникнуть непредвиденное поведение (хотя, опять же, если они имеют разные классы, он в любом случае вернет false).

@Override 
public boolean equals(Object obj) { 
    if (!(obj instanceof Ghost)) 
     return false; 

    // Cast Object to Ghost so the comparison below will work 
    Ghost other = (Ghost) obj; 

    return this.x == other.x 
     && this.y == other.y 
     && this.direction == other.direction 
     && this.color.equals(other.color); 
} 
+0

Ahh ok получил его. У меня уже был метод equals, поэтому я просто использовал его в цветовом поле, и теперь он работает :) Спасибо – Snowman

4

В принципе, это выглядит нормально.

Обратите внимание, что вы сравниваете использование ==. Для примитивов это не проблема, но для объектов он будет проверять один и тот же экземпляр, а не одно и то же значение. Это может быть или не быть тем, что вы хотите. Если вы сравниваете, например, java.lang.Strings, вы бы хотели вместо этого использовать equals (и проверить на null).

3

Если вы сравниваете переменные объекта вместо примитивных типов, вместо этого вы должны использовать сравнение this.color.equals(other.color).

В вашем случае это также зависит от того, как вы создали объекты Color. если вы использовали статические экземпляры (например, Color.BLUE), то на самом деле это не имеет значения. Если вы создали объект Color из значений rgb, это определенно имеет значение. В любом случае, лучше всего использовать метод .equals() для переменных объекта.

3

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

public boolean equals(Ghost other){ 

вы должны иметь:

public boolean equals(Object other){ 

, а затем внутренне протестировать other парам, является ли instanceofGhost и литая, как necessry.

+0

+1 Приятно поймать. Должен ли я исправить свой ответ, поскольку, поскольку он соответствует моей второй части ответа, это неверно? – BoltClock

+0

Да, добавьте его для получения более полного ответа. – akf