2011-12-01 60 views
12

Tôi thường tìm thấy phương thức bằng ở các vị trí khác nhau. Nó thực sự làm gì? Điều quan trọng là chúng ta phải có điều này trong mỗi lớp học?Bằng (Object obj) làm gì?

public boolean equals(Object obj) 
    { 
    if (obj == this) 
    { 
     return true; 
    } 
    if (obj == null) 
    { 
     return false; 
    } 
    if (obj instanceof Contact) 
    { 
     Contact other = (Contact)obj; 
     return other.getFirstName().equals(getFirstName()) && 
       other.getLastName().equals(getLastName()) && 
       other.getHomePhone().equals(getHomePhone()) && 
       other.getCellPhone().equals(getCellPhone()); 

    } 
    else 
    { 
     return false; 
    } 
} 
+4

Tôi cho rằng bạn đã xem tài liệu hướng dẫn rõ ràng: http://docs.oracle.com/javase/6/docs/api/java/lang/Object.html [cuộn xuống bằng() vì liên kết trực tiếp dường như không hoạt động trong các cam kết]. – NPE

Trả lời

31

Nó xác định lại "bình đẳng" đối tượng.

Theo mặc định (được xác định trong java.lang.Object), một đối tượng chỉ bằng một đối tượng khác nếu nó là cùng một cá thể. Nhưng bạn có thể cung cấp logic bình đẳng tùy chỉnh khi bạn ghi đè lên nó. Ví dụ: java.lang.String xác định sự bình đẳng bằng cách so sánh mảng ký tự bên trong. Đó là lý do:

String a = new String("a"); //but don't use that in programs, use simply: = "a" 
String b = new String("a"); 
System.out.println(a == b); // false 
System.out.println(a.equals(b)); // true 

Mặc dù bạn có thể không cần phải kiểm tra sự bình đẳng như vậy, các lớp bạn sử dụng. Ví dụ: triển khai List.contains(..)List.indexOf(..) sử dụng .equals(..).

Kiểm tra the javadoc để biết hợp đồng chính xác được yêu cầu theo phương thức equals(..).

Trong nhiều trường hợp khi ghi đè equals(..) bạn cũng phải ghi đè hashCode() (sử dụng cùng các trường). Điều đó cũng được xác định trong javadoc.

1

Nó cho phép bạn xác định lại đối tượng nào bằng nhau và không, ví dụ bạn có thể xác định hai đối tượng Person như nhau nếu Person.ID giống nhau hoặc nếu Weight bằng nhau tùy thuộc vào logic trong ứng dụng của bạn.

Xem này: Overriding the java equals() method quirk

11

lớp khác nhau có những tiêu chí khác nhau cho những gì làm cho 2 đối tượng "bình đẳng". Thông thường, bằng() trả về giá trị đúng nếu nó là cùng một đối tượng:

Object a = new Object(); 
Object b = new Object(); 
return(a.equals(b)); 

Điều này sẽ trả về false, mặc dù chúng không giống nhau. a.equals(a) sẽ trả về true.

Tuy nhiên, trong những trường hợp như một String, bạn có thể có 2 trường hợp khác nhau nhưng Chuỗi bình đẳng dựa trên các ký tự chữ tạo nên những Strings:

String a = new String("example"); 
String b = new String("example"); 
String c = new String("another"); 
a.equals(b); 
a.equals(c); 

Đây là tất cả các trường hợp khác nhau của String, nhưng các số bằng đầu tiên sẽ trả về true vì chúng là cả hai số "ví dụ", nhưng số thứ hai sẽ không phải vì "ví dụ" không phải là "một loại khác".

Bạn sẽ không cần ghi đè bằng() cho mỗi lớp, chỉ khi có trường hợp đặc biệt cho bình đẳng, như lớp chứa 3 chuỗi, nhưng chỉ chuỗi đầu tiên được sử dụng để xác định bình đẳng. Trong ví dụ bạn đã đăng, có thể có một trường khác, description có thể khác với 2 "Danh bạ" khác nhau, nhưng 2 "Danh sách liên hệ" sẽ được xem là bình đẳng nếu 4 tiêu chí đó khớp nhau (họ/tên và điện thoại nhà/điện thoại di động) số), trong khi mô tả phù hợp hoặc không phù hợp không chơi vào việc 2 Liên hệ là bình đẳng.

3

Phương pháp equals được sử dụng khi người ta muốn biết liệu hai đối tượng có tương đương với bất kỳ định nghĩa nào mà các đối tượng tìm thấy phù hợp hay không.Ví dụ, đối với String đối tượng, sự tương đương là về việc liệu hai đối tượng có đại diện cho cùng chuỗi ký tự hay không. Vì vậy, các lớp học thường cung cấp việc thực hiện của riêng mình equals hoạt động theo cách tự nhiên cho lớp đó.

Phương pháp equals khác với == trong đó các phép thử sau cho nhận dạng đối tượng, có nghĩa là, cho dù các đối tượng giống nhau (không nhất thiết phải giống nhau).

8

Bên cạnh tất cả mọi thứ do Bozho, có một số điều bổ sung phải nhận thức được nếu trọng bằng:

  • một cái gì đó.equals(null) phải luôn luôn trả về false - ví dụ: null là không bằng bất cứ điều gì khác. Yêu cầu này được xử lý trong lần thứ hai nếu mã của bạn.

  • nếu đúng là một cái gì đó == cái gì khác, sau đó cũng một cái gì đó.equals(cái gì khác) cũng phải đúng. (tức là các đối tượng giống nhau phải bằng nhau) Đầu tiên nếu mã của bạn xử lý việc này.

  • .equals NÊN được đối xứng cho các đối tượng không null, tức là a.equals(b) phải giống như b.equals(a). Đôi khi, yêu cầu này phá vỡ nếu bạn đang phân lớp và ghi đè bằng trong lớp cha và trong lớp con. Thường bằng với mã như if (!getClass().equals(other.getClass())) return false; ít nhất đảm bảo rằng một loại đối tượng khác nhau không bằng nhau.

  • Nếu bạn ghi đè equals bạn cũng phải ghi đè hashCode sao cho biểu thức sau đây đúng: if (a.equals(b)) assert a.hashCode() == b.hashCode(). I E. mã băm của hai đối tượng bằng nhau phải giống nhau. Lưu ý rằng ngược lại không đúng: hai đối tượng có cùng mã băm có thể hoặc không thể bằng nhau. Một cách bình thường, yêu cầu này được quan tâm bằng cách lấy hashCode từ các thuộc tính giống nhau được sử dụng để xác định sự bình đẳng của một đối tượng.

Trong trường hợp của bạn, phương thức hashCode có thể là:

public int hashCode() { 
    return getFirstName().hashCode() + 
    getLastName().hashCode() + 
    getPhoneHome().hashCode() + 
    getCellPhone().hashCode(); 
} 
  • Nếu bạn thực hiện Comparable so sánh hai đối tượng nếu họ là nhỏ hơn, lớn hơn, hoặc bằng nhau, a.compareTo(b) == 0 nên đúng nếu và chỉ khi a.equalTo(b) == true

Trong nhiều IDE (ví dụ: Eclipse, IntelliJ IDEA, NetBeans) có các tính năng g enerate cả hai equalshashCode cho bạn, do đó tiết kiệm bạn của tẻ nhạt và có thể dễ bị lỗi.

Các vấn đề liên quan