Đè chồng phương thức equals()
Để đè chồng phương thức equals() nhằm so sánh các đối tượng thì thực tế chúng ta phải đè chồng hai phương thức:
PHP:
public boolean equals(Object other) {
if (this == other)
return true;
if ( !(other instanceof Adult) )
return false;
Adult otherAdult = (Adult)other;
if (this.getAge() == otherAdult.getAge() &&this.getName().equals(otherAdult.getName()) &&this.getRace().equals(otherAdult.getRace()) &&this.getGender().equals(otherAdult.getGender()) &&this.getProgress() == otherAdult.getProgress() &&this.getWallet().equals(otherAdult.getWallet()))
return true;
else
return false;
}
public int hashCode() {
return firstname.hashCode() + lastname.hashCode();
}
* Nếu đối tượng được so sánh chính là đối tượng so sánh thì hai đối tượng này là rõ ràng là bằng nhau, bởi vậy ta trả lại giá trị true
* Chúng ta kiểm tra để chắc chắn rằng đối tượng mà chúng ta sẽ đem so sánh là một cá thể của lớp Adult (nếu không thì hai đối tượng này không thể như nhau được)
* Chúng ta ép kiểu đối tượng được gửi đến thành một Adult để có thể gọi các phương thức phù hợp của nó
* Chúng ta so sánh các mảnh của hai Adult, chúng sẽ phải giống nhau nếu hai đối tượng là “bằng nhau” (dù theo bất cứ định nghĩa nào về phép bằng mà chúng ta sử dụng)
* Nếu bất cứ mảnh nào không bằng nhau thì chúng ta sẽ trả về giá trị là false; ngược lại trả về giá trị true
Lưu ý rằng chúng ta có thể so sánh age bằng toán tử == vì age là giá trị nguyên thủy. Chúng ta dùng phương thức equals() để so sánh các String, vì lớp đó đè chồng phương thức equals() để so sánh nội dung của các String (nếu ta dùng toán tử ==, chúng ta sẽ luôn nhận được kết quả trả về là false, vì hai String không bao giờ cùng là một đối tượng). Chúng ta làm tương tự với ArrayList, vì nó đè chồng phương thức equals() để kiểm tra xem hai danh sách có cùng các phần tử theo cùng thứ tự hay không, như thế là đủ cho ví dụ đơn giản của chúng ta.
Bất cứ khi nào bạn đè chồng phương thức equals(), bạn cũng nên viết đè chồng cả phương thức hashCode() nữa. Lý do vì sao lại như thế nằm ngoài phạm vi của tài liệu hướng dẫn này, nhưng hiện giờ, chỉ cần biết rằng ngôn ngữ Java dùng các giá trị được trả về từ phương thức hashCode() này để đặt các cá thể của lớp của bạn vào các sưu tập, các sưu tập này lại dùng thuật toán băm để sắp đặt các đối tượng (như HashMap). Quy tắc nghiêm ngặt và nhanh chóng để quyết định hashCode() phải trả lại giá trị gì (ngoài việc nó phải trả lại một số nguyên) là nó phải trả về:
* Cùng giá trị giống nhau cho cùng một đối tượng vào mọi thời điểm.
* Các giá trị bằng nhau đối với các đối tượng bằng nhau.
Thông thường, việc trả về giá trị mã băm của một vài hoặc toàn bộ các biến cá thể của một đối tượng là một cách thích hợp để tính toán ra mã băm. Một lựa chọn khác là chuyển đổi các biến thành String, nối chúng lại và sau đó trả về mã băm của String kết quả. Một lựa chọn khác nữa là để một hoặc một vài biến kiểu số với một hằng số nào đó để làm cho kết quả trở nên có tính duy nhất hơn nữa, nhưng việc này thường là quá mất công.
Đè chồng phương thức toString()
Lớp Object có một phương thức toString(), mọi lớp sau này do bạn tạo ra sẽ thừa kế nó. Nó trả về một biểu diễn dạng String của đối tượng của bạn và rất hữu dụng cho việc gỡ lỗi. Để xem phiên bản triển khai thực hiện mặc định của phương thức toString() làm gì thì ta hãy thử ví dụ sau trong main():
PHP:
public static void main(String[] args) {Adult myAdult = new Adult();
myAdult.addMoney(1);myAdult.addmoney(5);
System.out.println(myAdult);
}
PHP:
intro.core.Adult@b108475c
PHP:
public String toString() {StringBuffer buffer = new StringBuffer();
buffer.append("And Adult with: " + "n");buffer.append("Age: " + age + "n");buffer.append("Name: " + getName() + "n");buffer.append("Race: " + getRace() + "n");buffer.append("Gender: " + getGender() + "n");buffer.append("Progress: " + getProgress() + "n");buffer.append("Wallet: " + getWallet());
return buffer.toString();
}
PHP:
An Adult with:Age: 25
Name: firstname lastname
Race: inuit
Gender: male
Progress: 0
Wallet: [1, 5]
0 nhận xét:
Đăng nhận xét