2015-12-16 1 views
0

У меня есть образец класс Java для банковских счетов:@overriding равно() и хэш-код() в классе Java

public class Account { 
    private Integer accountNumber; 
    private Integer authPin; 
    private Integer transactionPin; 

    public Account(Integer accountNumber, Integer authPin, Integer transactionPin) { 
     this.accountNumber = accountNumber; 
     this.authPin = authPin; 
     this.transactionPin = transactionPin; 
    } 

    public Integer getAccountNumber() { 
     return accountNumber; 
    } 

    public void setAccountNumber(Integer accountNumber) { 
     this.accountNumber = accountNumber; 
    } 

    public Integer getAuthPin() { 
     return authPin; 
    } 

    public void setAuthPin(Integer authPin) { 
     this.authPin = authPin; 
    } 

    public Integer getTransactionPin() { 
     return transactionPin; 
    } 

    public void setTransactionPin(Integer transactionPin) { 
     this.transactionPin = transactionPin; 
    } 

    @Override 
    public String toString() { 
     return accountNumber + "," + authPin + "," + transactionPin; 
    } 

    @Override 
    public boolean equals(Object obj) { 
     Account account = (Account) obj; 
     return (this.accountNumber == account.getAccountNumber() && this.authPin == account.getAuthPin() 
       && this.transactionPin == account.getTransactionPin()); 
    } 

    @Override 
    public int hashCode() { 
     // TODO Auto-generated method stub 
     return Objects.hashCode(this.getAccountNumber()); 
    } 
} 

Как видно из фрагмента кода, я переопределен Equals() и хэш-код (). Но когда я пытаюсь сделать простую проверку утверждают, с помощью JUnit, это не удается:

public class TestFileIO { 
    Account account; 

    @Before 
    public void setUp() throws Exception { 
     account = new Account(7, 2708, 2708); 
    } 

    @Test 
    public void testReadTransactionFile() { 
     assertEquals(account, new Account(7, 2708, 2708)); 
    } 

Я пропускаю что-то важное здесь?

+1

Вы сравниваете целые ссылки в методе 'equals' (не говоря уже о потенциальном' ClassCastException'). Или используйте 'int' или' Integer # equals() '. –

+0

имеет смысл. Полностью пропустил этот момент. – Anurag

ответ

1

Вместо сравнения Integer ссылок на объекты:

return (this.accountNumber == account.getAccountNumber() && this.authPin == account.getAuthPin() 
     && this.transactionPin == account.getTransactionPin()); 

Поскольку, Integer ссылки на объект не равен, например, это утверждение не:

// different identities -> this assertion fails 
assert new Integer(7) == new Integer(7); 

Использование .equals:

return (Objects.equals(this.accountNumber, account.getAccountNumber()) 
     && Objects.equals(this.authPin, account.getAuthPin()) 
     && Objects.equals(this.transactionPin, account.getTransactionPin())); 

Если поля гарантированно никогда не будет null, а затем изменить их тип на int:

private int accountNumber; 
private int authPin; 
private int transactionPin; 

Тогда вам не нужно менять equals реализации, хорошо, как она есть.

Смежные вопросы