2011-09-07 29 views
6

Tôi muốn so sánh hai đối tượng Java mà không ghi đè bằng phương thức. Vì tôi cần phải ghi đè phương thức equals bằng n số Lớp tôi có, tôi cần một phương thức tiện ích chung để chúng ta có thể so sánh hai đối tượng Java.Phương pháp phổ biến để so sánh hai đối tượng Java

Something như:

A a1,a2; 
B b1,b2; 
C c1,c2; 
----- 
----- 
boolean isEqual1 = new ObjectComparator().isEquals(a1 , a2); 
boolean isEqual2 = new ObjectComparator().isEquals(b1 , b2); 
boolean isEqual3 = new ObjectComparator().isEquals(c1 , c2); 

Xin hãy giúp tôi ra để viết một tiện ích phổ biến để so sánh bất kỳ đối tượng Java

Hope bằng cách sử dụng Field lớp, và getClass phương pháp chúng ta có thể đạt được nó. Xin vui lòng hướng dẫn cho tôi.

+0

http://www.unitils.org/apidocs/org/unitils/reflectionassert/ReflectionComparator.html xem xét điều này. – amod

Trả lời

9

Hãy xem EqualsBuilder.reflectionEquals trong thư viện Apache Commons.

Từ documentation:

Phương pháp này sử dụng phản xạ để xác định nếu hai đối tượng đều bình đẳng.

Sử dụng AccessibleObject.setAccessible để truy cập vào các trường riêng tư. Điều này có nghĩa là nó sẽ ném một ngoại lệ bảo mật nếu chạy dưới một trình quản lý bảo mật, nếu các điều khoản không được thiết lập chính xác. Nó cũng không hiệu quả như kiểm tra một cách rõ ràng.


Vì vậy, trong ví dụ của bạn nó sẽ như thế nào:

A a1,a2; 
B b1,b2; 
C c1,c2; 
----- 
----- 
boolean isEqual1 = EqualsBuilder.reflectionEquals(a1 , a2); 
boolean isEqual2 = EqualsBuilder.reflectionEquals(b1 , b2); 
boolean isEqual3 = EqualsBuilder.reflectionEquals(c1 , c2); 
+0

Cảm ơn bạn rất nhiều. Điều đó đã cho tôi một sự khởi đầu. Tôi cần phải tùy chỉnh lớp đó để thêm một số tính năng như, thêm một exumption vào một lĩnh vực từ so sánh vv Lớp EqualsBuilder sẽ giúp tôi trong việc đạt được những tính năng bằng cách mở rộng lớp đó? –

+0

CẢNH BÁO: theo EqualsBuilder.reflectionEquals (Object lhs, Object rhs) Javadoc "Các thành viên tạm thời sẽ không được kiểm tra". Vì vậy, tức là EqualsBuilder.reflectionEquals (ngày mới (2), ngày mới (3)) sẽ trả về giá trị true. Sử dụng reflectionEquals tốt hơn (Object lhs, Object rhs, boolean testTransients). – machinery

2

Hãy thử Apache Commons EqualsBuilder#reflectionEquals phương pháp và kiểm tra xem nó đáp ứng nhu cầu của bạn.

+1

CẢNH BÁO: theo EqualsBuilder.reflectionEquals (Object lhs, Object rhs) Javadoc "Các thành viên tạm thời sẽ không được kiểm tra". Vì vậy, tức là EqualsBuilder.reflectionEquals (ngày mới (2), ngày mới (3)) sẽ trả về giá trị true. Sử dụng reflectionEquals tốt hơn (Object lhs, Object rhs, boolean testTransients). – machinery

3

Đây có thể là những gì bạn đang tìm kiếm EqualsBuilder.reflectionEquals

public boolean equals(Object obj) { 
    return EqualsBuilder.reflectionEquals(this, obj); 
} 
+0

* [...] không ghi đè phương thức equals [...] * (+1 cho dù sao ;-) – aioobe

+0

Ví dụ của nó từ tài liệu mà bạn có thể gọi mà không ghi đè. ;) –

+1

CẢNH BÁO: theo EqualsBuilder.reflectionEquals (Object lhs, Object rhs) Javadoc "Các thành viên tạm thời sẽ không được kiểm tra". Vì vậy, tức là EqualsBuilder.reflectionEquals (ngày mới (2), ngày mới (3)) sẽ trả về giá trị true. Sử dụng reflectionEquals tốt hơn (Object lhs, Object rhs, boolean testTransients). – machinery

1

Thứ nhất, là có một lý do thuyết phục tại sao bạn không muốn sử dụng phương pháp bình đẳng? Phương thức equals được sử dụng trong nội bộ bởi các lớp sưu tập và vì vậy bạn sẽ phải tuân theo hợp đồng bằng.

Nếu có, sau đó có, bạn có thể thực hiện một trường theo so sánh trường bằng phản chiếu. Lấy list of fields của lớp và cho mỗi trường check the value. Bạn cũng sẽ phải đảm bảo rằng họ là cả hai trường hợp của cùng một lớp học trả trước.

+1

Lý do thuyết phục là lớp học của tôi có thể phát triển với nhiều lĩnh vực hơn. mỗi lần tôi cũng cần cập nhật phương thức equals. –

0

Bạn muốn Objects.equals(a,b) sẵn trong Java 1.7, trong gói java.util

Nếu bạn đang sử dụng một phiên bản sớm hơn so với Java 1.7, bạn có thể sử dụng một trong các thư viện mà người khác đã gợi ý, đáng chú ý là hầu hết các dự án Apache Commons .

+3

Ý bạn là ở đây Objects.deepEquals (a, b). Objects.equals (a, b) chỉ sử dụng các hàm equals() mặc định của các đối tượng, nhưng có thể xử lý các giá trị rỗng. – Asturio

0

Bạn có thể muốn xem xét sử dụng Shazamcrest.

Từ trang github của họ:

Có một bean Person với cấu trúc sau:

Person person 
    |-- String name 
    |-- String surname 
    |-- Address address 
     |-- String streetName 
     |-- int streetNumber 
     |-- String postcode 

để so sánh hai Person đậu với Shazamcrest chúng ta sẽ viết:

assertThat(actualPerson, sameBeanAs(expectedPerson)); 
0

Hãy thử điều này. Điều này hoạt động hoàn hảo nhưng cần nhiều không gian heap hơn nếu các đối tượng mà bạn so sánh là rất lớn. org.unitils.reflectionassert.ReflectionAssert.assertReflectionEquals (obj1, obj2)

http://www.unitils.org/

Bạn có thể lấy jar từ bên dưới.

<!-- https://mvnrepository.com/artifact/org.unitils/unitils --> 
     <dependency> 
      <groupId>org.unitils</groupId> 
      <artifactId>unitils</artifactId> 
      <version>2.2</version> 
     </dependency> 
Các vấn đề liên quan