2015-06-26 3 views
-1

Мне нужна помощь, чтобы переопределить метод equals. У меня все работает, кроме метода equals. Метод equals, который у меня есть, не дает мне правильного ответа. Я не могу понять, что может быть проблемой.метод равен - как переопределить

Мой класс:

package myclasses; 

public class Currency 
{ 
    private int dollars, cents; 

    public Currency() 
    { 
     dollars = 0; 
     cents = 0; 
    } 

    public Currency(int d, int c) 
    { 
     this.dollars = d; 
     this.cents = c; 

     setCents(cents); 
    } 

    public int getDollars() 
    { 
     return dollars; 
    } 

    public int getCents() 
    { 
     return cents; 
    } 

    private void setDollars(int dollars) 
    { 
     this.dollars = dollars; 
    } 

    private void setCents(int cents) 
    {  
     while(cents > 99) 
     { 
      cents = (cents - 100); 
      dollars++; 
     } 

     this.cents = cents; 
    } 

    public void setAmount(int newDollars, int newCents) 
    { 
     setDollars(dollars); 
     setCents(cents); 
    } 

    public void add(int dollars, int cents) 
    { 
     this.dollars = dollars + getDollars(); 
     cents = cents + getCents(); 

     setCents(cents); 
    } 

    public boolean equals(Object dollars, Object cents) 
    { 
     if(this == dollars && this == cents) 
      return true; 

     if(!(dollars instanceof Currency) || !(cents instanceof Currency)) 
      return false; 

     Currency money = (Currency) dollars; 
     Currency penny = (Currency) cents; 

     return (this.dollars == money.dollars) && (this.cents == penny.cents); 
     //return Currency.dollars.equals(Currency.cents); 
     //return this.equals(dollars) && this.equals(cents); 

    } 

    public boolean isZero() 
    { 
     if(getDollars() == 0 && getCents() == 0) 
     { 
      return true; 
     } 
     return false; 
    } 

    public String toString() 
    { 
     return "$" + getDollars() + "." + 
       (getCents() < 10 ? ("0" + getCents()) : getCents()); 
    } 
} 
+3

Вы понимаете, что 'equals' обычно используется для сравнения другой, как объект (т.е. это подпись должна быть' Equals (Object другой) ', то есть только один параметр – MadProgrammer

ответ

7

Ваш метод equals() имеет некоторые ошибки, такие как:

if(this == dollars && this == cents) 

Это никогда не будет правдой ... это должно быть:

if(this.dollars == dollars && this.cents == cents) 

Но я не будет прилагать никаких усилий для кодирования равных, рекомендуется автогенерировать равных. Что-то вроде этого:

@Override 
public boolean equals(Object obj) { 
    if (this == obj) 
     return true; 
    if (obj == null) 
     return false; 
    if (getClass() != obj.getClass()) 
     return false; 
    Currency other = (Currency) obj; 
    if (cents != other.cents) 
     return false; 
    if (dollars != other.dollars) 
     return false; 
    return true; 
} 

Также является настоятельно рекомендуется (почти неизбежно, как заметил @AdriaanKoster), когда вы переопределить equals() метод, также переопределить hashCode()
В equals() определения:

Обратите внимание, что как правило, необходимо переопределить метод hashCode всякий раз, когда этот метод переопределяется, чтобы поддерживать общий контракт для метода hashCode, который утверждает, что равные объекты должны иметь одинаковые хэш-коды.

код Hash:

@Override 
public int hashCode() { 
    final int prime = 31; 
    int result = 1; 
    result = prime * result + cents; 
    result = prime * result + dollars; 
    return result; 
} 
+2

Это не просто «очень рекомендуется», но почти неизбежно переопределять как equals(), так и hashCode. См. контракт равных (http://docs.oracle.com/javase/7/docs/api/java/lang /Object.html#equals(java.lang.Object)) –

+1

@AdriaanKoster Я уверен, что Jordi уже знает это, но может добавить эту ссылку к нему. Я также рекомендую использовать Googles [AutoValue] (https: // docs .google.com/презентация/д/14u_h-lMn7f1rXE1nDiLX0azS3IkgjGl5 uxp5jGJ75RE/edit? pli = 1), чтобы избежать написания таких вещей, как 'equals',' hashcode' и 'toString' самостоятельно или чтобы этого не было в вашем классе. – Tom

+0

Спасибо @AdriaanKoster, добавил дополнительную информацию, чтобы уточнить;) –

1

Я не совсем уверен, почему вы собираетесь первый чек в вашем методе Equals. Но я расскажу вам, как я обычно делаю свой метод равным

public boolean equals(Object obj) { 
    if (this == obj) { 
     return true; 
    } else if (obj == null) { 
     return false; 
    } else if (getClass() != obj.getClass()) { 
     return false; 
    } 

    //a cast of object to the class you are using should be here 
    if (this.someField.equals(castObject.someField) 
      && this.otherField.equals(castObject.otherField)) { 
     return true; 
    } 

    return false; 
} 

Так вот что происходит. Первая часть метода выполняет базовые проверки - тестируется ли объект, который вы тестируете, такой же, как параметр, независимо от того, является ли объект нулевым и являются ли они из одного класса. Обратите внимание, что они - еще что-то, потому что их больше, чем только 3 случая.

Если вы не указали ни одного из 3-х начальных условных операторов, вам нужно будет сделать бросок параметра obj классу, в котором вы находитесь. Вы можете сделать это из-за последнего, если -

else if (getClass() != obj.getClass()) { 
    return false; 
} 

После этого просто определите правило, по которому вы определяете, являются ли два объекта одинаковыми. В примере, который я использую, я проверяю содержимое двух полей класса. Если они одинаковы, объекты равны.

-1

Если вы переопределяете метод equals, то ваш вышеприведенный код неправильно переопределяет метод equals.

использовать ниже код вместо для подмены equals--

public boolean equals(Object currency) { 

Currency newref = null; 

if (currency instanceof Currency) { 
    newref = (Currency)currency; 
} 
return (this.dollars == newref.dollars) && (this.cents == newref.cents); 
} 
Смежные вопросы