2011-11-14 20 views
11

Hãy xem xét rằng tôi đã có một chương trình Java tiêu chuẩn: tức là nó chứa các thành viên có String, List, HashMap vvPhát hiện nếu một đối tượng Java đã được sửa đổi?

Câu hỏi của tôi là: cách đơn giản nhất là những gì để phát hiện nếu một thể hiện của một đối tượng như vậy đã được sửa đổi từ nói một trạng thái trước đó/ban đầu?

Lý do tôi muốn biết điều này là vì vậy tôi xác định xem tôi có nên cập nhật đối tượng trong DB hay không, trong trường hợp: (i) không có thay đổi hoặc (ii) thay đổi được thực hiện sau đó đảo ngược.

Tôi đã suy nghĩ về việc so sánh hashCode hoặc byte [], nhưng dường như không hoạt động. Ý tưởng nào?

+0

Đã lâu rồi - có lẽ bạn có thể chấp nhận câu trả lời? – Bohemian

Trả lời

4

nếu bạn có người định cư, hãy thông báo cho một danh sách người nghe trong những người định cư này nếu một giá trị mới được đặt.

+0

Là phụ đề trong chuỗi rất cũ này để giúp những người khác đến với Google: Điều đó không có tác dụng vì thay đổi "không" sẽ không được phát hiện, ví dụ: setString ("newString") + setString (oldValue) sẽ không thay đổi bất cứ điều gì nhưng theo phương pháp của bạn, bạn nhận được một cảnh báo tích cực – alex

+0

@alex Có, đó là bằng cách nào đó đúng. Nhưng đó là vấn đề về định nghĩa. Sau khi bạn gọi 'setString (" newString ")' trạng thái của đối tượng đã thay đổi chắc chắn, vì vậy nó có thể hợp lệ để thông báo cho một người nghe. Có lẽ bạn muốn tồn tại đối tượng bất cứ lúc nào nó thay đổi? Rằng bạn sẽ thay đổi chuỗi trở lại giá trị cũ cuối cùng trong tương lai, có thể là quan trọng. Nhưng nó không phải. Đó là vấn đề của trường hợp sử dụng của bạn. –

+0

Ok chắc chắn, đối tượng đã thay đổi. Nhưng tôi đã có trong tâm trí, rằng một số ứng dụng thông báo về một trạng thái thay đổi, mặc dù trạng thái ban đầu đã được khôi phục. Theo định nghĩa, thao tác đã được thực hiện nhưng không hợp lý/hữu ích để phát hiện sửa đổi trong trường hợp đó cho mọi tình huống – alex

4

Cùng một vấn đề đã có hibernate nhà phát triển và họ đã xử lý nó bằng cách tạo proxy cho các thực thể được trả lại. Proxy đăng ký mỗi cuộc gọi setter và do đó xác định nếu thực thể đã thay đổi.

7

Có, nó có thể được thực hiện, và nó đã được thực hiện ... nó được gọi là hibernate. Chỉ cần sử dụng điều đó và không "phát minh lại bánh xe"

+1

Bạn có thể cung cấp một chút chi tiết về nó hay tham chiếu cụ thể hơn của bất kỳ trang web nào. –

2

Vì bạn đang sử dụng quy ước JavaBeans, tốt nhất là bạn nên cập nhật một số cờ nếu chúng được gọi với đối số khác với mục tiêu giá trị hiện tại của trường. Nếu bạn cần tìm hiểu xem hai hoặc nhiều cuộc gọi có dẫn đến thay đổi thực tế hay không (ví dụ: A-> B-> A không thay đổi), thì sẽ phức tạp hơn. Tôi không chắc nó có đáng giá không.

Bạn có thể muốn sử dụng API Java Persistance (JPA), tốt hơn rất nhiều cho loại nội dung này. Nó cũng có thể được sử dụng bên ngoài ngữ cảnh Java EE, trong các ứng dụng Java SE thuần túy. Đó là một chút công việc ở đó, vì bạn sẽ cần phải chăm sóc các cam kết giao dịch và rollback, nhưng API sẽ chứng minh rất hữu ích anyway.

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