2011-11-14 3 views
11

は、私は、標準のJava Beanを持っていることを考えてみましょう:それはStringListHashMapであるメンバーなどが含まれています。すなわちJavaオブジェクトが変更されているかどうかを検出しますか?

私の質問は:何がこのようなオブジェクトのインスタンスがされているかどうかを検出するのが最も簡単な方法です前の/元の状態から変更されましたか?

私がこれを知りたい理由は、(i)変更が行われなかった、または(ii)変更が行われたが、その後、逆転した。

私はhashCode、またはbyte []の比較について考えてきましたが、うまくいかないようです。何か案は?

+0

これはしばらくお待ちください - おそらくあなたは答えを受け入れることができますか? – Bohemian

答えて

4

設定者がいる場合は、新しい値が設定されている場合はこの設定者のリスナーのリストに通知します。

+0

他の人がGoogleを訪れるのを助けるために、この非常に古いスレッドに追加してください: "null"の変更が検出されないため、動作しません。 setString( "newString")+ setString(oldValue)は何も変更しませんが、あなたのメソッドに続いて肯定的な警告を受け取ります – alex

+0

@alexはい、何とかそうです。しかしそれは定義の問題です。 'setString(" newString ")を呼び出した後は、オブジェクトの状態が確実に変更されているので、リスナーに通知することができます。それが変わるたびにオブジェクトを永続させたいのでしょうか?最終的に将来的に文字列を古い値に戻すことが重要である可能性があります。しかし、それはする必要はありません。あなたのユースケースの問題です。 –

+0

オブジェクトが変更されていることを確認してください。しかし、元の状態が既に復元されているにもかかわらず、一部のアプリが変更された状態について通知することを心に留めていました。定義ごとに操作が行われましたが、そのような場合にはすべての状況に対して変更を検出するためには論理的でない/有用ではありません – alex

4

同じ問題がhibernateの開発者であり、返されたエンティティのプロキシを作成することによってそれを処理しました。プロキシは各セッター呼び出しを登録し、エンティティーが変更されたかどうかを判断します。

7

はい、できます。でした。これはhibernateと呼ばれています。ただそれを使用して、 "ホイールを再発明"しないでください

+1

それについての詳細やサイトのより具体的な参照を教えてください。 –

2

JavaBeansの規約を使用しているので、ターゲットと異なる引数で呼び出された場合、セッターにいくつかのフラグを更新させることをお勧めしますフィールドの現在の値。 2つ以上の呼び出しで実際の変更が発生するかどうかを調べる必要がある場合(たとえば、A→B→Aは変更されません)、より複雑になります。オーバーヘッドに値するとは思えません。

Java Persistance API(JPA)を使用したい場合がありますが、これはこの種のものにはかなり優れています。これは、Java EEのコンテキストの外でも、単純なJava SEアプリケーションでも使用できます。トランザクションのコミットとロールバックを処理する必要があるため、そこではもう少し作業がありますが、APIはとにかく非常に便利です。

関連する問題