2010-08-11 39 views
6

Tôi có hai phiên bản của cùng một lớp. Tôi cần phải tìm tài sản (s) mà là khác nhau giữa chúng (về cơ bản giá trị của tài sản, nói firstName có thể khác nhau trong cả hai). Các trường là nguyên thủy, phức tạp cũng như các bộ sưu tập. Về cơ bản, tôi cần phải tìm sự khác biệt giữa hai trường hợp và nếu các trường khác nhau trong cả hai trường hợp, tôi sẽ sao chép giá trị của trường từ ví dụ đầu tiên sang thể hiện thứ ba (đối tượng khác).Sự khác biệt giữa hai trường hợp cùng một lớp

Tôi nghĩ rằng tôi có thể sử dụng sự phản chiếu, nhưng các lớp học rất phức tạp và nó có thể trở thành dễ bị lỗi.

+1

Hm ... không có hai hạt Java nào giống nhau ... http://www.coffeeobsessed.net/wp-content/uploads/2010/02/kawa-java-beans.jpg –

Trả lời

1

viết một phương pháp như

public YourClass diff(YourClass other) { 
    // diff code here 
} 

hoặc

public static YourClass diff(YourClass first, YourClass second) { 
    // diff code here 
} 

và quấn một số xét nghiệm đơn vị xung quanh việc triển khai.

Reflection có vẻ phức tạp hơn, nhưng nó có những ưu điểm sau:

1) Nó có thể là chung chung và bạn có thể làm cho công việc mã tương tự với bất kỳ lớp
2) Nó sẽ không cần phải thay đổi nếu lớp học phát triển.

Nếu bạn muốn sử dụng tính năng phản chiếu, bạn có thể sử dụng Class.getDeclaredFields() (google cho "java class api 6") để nhận tất cả các trường trên lớp và sau đó bạn có thể sử dụng trường api để lấy giá trị cho một đối tượng. Nếu bạn muốn thực sự ưa thích, bạn có một chuỗi tĩnh [] "diffIgnoredFields" và bao gồm các tên trường mà bạn muốn bỏ qua trong phần khác.

+1

-1. Câu trả lời này không cung cấp bất kỳ chi tiết triển khai nào cho phần thực sự là thử thách. –

+0

@mike, còn bây giờ thì sao? – hvgotcodes

+0

@hvgotcoes, vâng. Tôi undid downvote của tôi. "Diff code here" không phải là câu trả lời hay cho câu hỏi về cách viết mã khác. –

2

Không có cách nào khác ngoài việc sử dụng sự phản chiếu nếu bạn muốn làm điều đó một cách tổng quát. Nếu các trường của bạn có getters thì bạn có thể tiếp tục so sánh nó với phương thức equals. Sau đó, bạn có biết các lĩnh vực tại thời gian biên dịch.

+2

Đây là một vấn đề khó khăn. Vì các đối tượng thực sự là con trỏ trong ngụy trang, cần phải có khả năng phân biệt giữa x.a và x.b trỏ đến cùng một đối tượng, và x.a và x.b trỏ đến hai đối tượng khác nhau, bằng nhau. Nhân tiện, tất cả các thành viên và thành viên của các thành viên phải thực hiện 'IComparable' đúng cách, hoặc một cái gì đó như thế. Ngoài ra, máy tính khác sẽ khó có thể so sánh các từ điển, tôi nghĩ vậy. Điều gì làm cho hai bộ từ điển hoặc bộ bằng nhau? Họ có phải là như vậy dưới mui xe? –

4

Câu hỏi của bạn có một chút không rõ ràng. Trước tiên, bạn nói "hai trường hợp của cùng một lớp", sau đó bạn nói "các lớp học rất phức tạp". Đây có phải là một giải pháp chung để tìm sự khác biệt giữa các cá thể cho bất kỳ lớp học nào hay chỉ là một trường hợp cụ thể? Sự mơ hồ khác là điều bạn ngụ ý bằng cách "sao chép sự khác biệt". Ví dụ: nếu chuỗi của nó là Chuỗi thì sự khác biệt giữa hai chuỗi sẽ được sao chép vào cá thể mới là gì? Nếu bộ sưu tập của nó là sự khác biệt giữa các bộ sưu tập là gì? Điều gì nếu bạn có hai ArrayLists có cùng một thứ trong các đơn đặt hàng khác nhau.

Nếu trường hợp cụ thể của nó, thì bạn có thể chỉ cần tạo một phương thức trên lớp mà bạn vượt qua trong một thể hiện của cùng một lớp. Sau đó, bạn có thể lặp qua từng trường và so sánh sự khác biệt.

public TheClass difference(TheClass that) { 
    TheClass newClass = new TheClas() 
    if (this.getName().equals(that.getName()) == false) { 
    newClass.setName(that.getName()); 
    } 
    ... 
} 

Nhưng điều này có thể bị mất tùy thuộc vào độ sâu của biểu đồ đối tượng của bạn.

Có lẽ mô hình trình xây dựng có thể hữu ích ở đây nếu bạn đang cố gắng xây dựng một giải pháp chung/có thể sử dụng lại. Bạn có thể xem cơ sở mã Apache Commons và xem cách chúng triển khai HashCodeBuilder và ToStringBuilder như thế nào. Họ thậm chí có một phiên bản phản chiếu của các tiện ích. Xem cách họ xử lý bằng phẳng và nông.

+1

* "Nhưng điều này có thể thoát ra khỏi bàn tay phụ thuộc vào độ sâu của đồ thị đối tượng của bạn" * ... và nó trở nên phức tạp hơn nếu biểu đồ trong cây không được cấu trúc. –

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