2014-11-15 3 views
-1

Итак, я знаю, что об этом широко говорят и обсуждаются, и я просто пытаюсь заставить свое равенство работать на фигуры. Я создал класс Shape, который говорит, какой тип Shape (например, rect, triangle, circle), и я пытаюсь вернуть true, если они имеют одинаковую форму.Реализация Equals и hashCode для моих объектов в Java

В основном для тестирования ...

Rectangle myRect = new Rectangle(3,5); 
Rectangle myRect2 = new Rectangle(3,5); 
    if (myRect==myRect2){    
      System.out.println("Both the objects are equal"); 
     }   
     else { 
      System.out.println("Both the objects are not equal"); 
     } 

и мой фактический класс Shape с временной отмены равных и хэш-код.

abstract class Shape 
{ 
abstract double area(); 

    public Shape getShape(){ 
    return shape; 
    } 

@Override 
    public boolean equals(Object other) { 
    if (other == this) return true; 
    if (other == null) return false; 
    if (getClass() != other.getClass()) return false; 
    Shape shape = (Shape)other; 
    return(other==this); 
    } 

    @Override 
    public int hashCode() { 
     return shape.hashCode(); 
    } 

В основном я все время становлюсь ложным в качестве вывода, любое понимание было бы полезно, спасибо!

+1

Что вы думаете 'другие == this' делает? –

+1

И что вы думаете, 'myRect == myRect2' делает? –

+0

Возможно, вы захотите проверить http://www.ideyatech.com/2011/04/effective-java-equals-and-hashcode/. –

ответ

2

myRect==myRect2 возвращает true только в том случае, если это те же объекты. Вы должны использовать myRect.equals(myRect2);

1

В java, когда дело доходит до объектов, использование == означает проверку адресного значения объекта. Позвольте мне объяснить это на примере:

Rectangle objA = new Rectangle(3,5); 
Rectangle objB = objA; 

objA Здесь создается на месте памяти A и objB указывает на ячейку памяти или где objA был создан. Это означает, что оба места памяти одинаковы, а это означает, что objA == objB вернет true.

Но в другом случае:

Rectangle objC = new Rectangle(3,5); 
Rectangle objD = new Rectangle(3,5); 

Вы могли бы сказать, о они оба имеют одинаковую ширину и высоту же, они должны быть одни и те же объекты. Но посмотрите, это не так, потому что objC был создан на память. C и objD был создан в памяти D, поскольку каждый из них был создан с помощью отдельного вызова new (конструктор). Места памяти в этом случае различны, это означает, что objC == objD вернет false.

Память не названа так, я просто использовал это, чтобы легче описать мои примеры.


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

Но ваша реализация .equals немного ошибочна.

Эта строка проверяет, указывает ли объект other на место памяти this.

if (other == this) return true; 

Но позже, у вас есть эти 2 строки:

Shape shape = (Shape)other; 
return(other==this); 

Вы ничего не делать с объектом формы, так почему бы даже создать его, это просто делает больше работы для сборщика мусора.И return other==this немного избыточно, потому что если предыдущая строка возвращает true, то только здесь можно возвращать false, поэтому эта проверка является только более сложной версией return false.


Когда вы используете абстрактные классы, которые затем продолженные другими производными классами, вы должны реализовать .equals метод в каждом из этих классов. Пример из вашего случая, вы, вероятно, захотите сравнить два прямоугольника иначе, чем два круга, не так ли?

Вместо того, чтобы использовать один общий метод .equals, который, честно говоря, не лучше, чем просто оператор ==, вы должны реализовать его для каждого из производных классов.

Я не знаю, как именно ваш Rectangle класс выглядит, но я дам ему попробовать:

public boolean equals(Object other) { 
    if (other == this) return true; 
    if (other == null) return false; 
    if (getClass() != other.getClass()) return false; 
    Rectangle rect = (Rectangle) other; 
    // compare measures of this and other Rectangle 
    return width == rect.width && height == rect.height; 
} 
Смежные вопросы