セッターを抽象化しない限り、何らかのイベント通知メカニズムを提供する必要があります。オブジェクトが JavaBeans の場合は、PropertyChangeSupport の使用とプロパティ変更イベントの起動を検討しています。
それを行う場合 (または変更を検出するための他のメカニズムがある場合)、Glazed Lists はObservableElementListを提供します。これを使用して、リストの最後から関連付けの同期を簡単に処理できます (つまり、A を List< A> に追加すると、a.setB( が自動的に呼び出されます)。 b)))。もう一方の方向は、プロパティ変更監視 (または同等のもの) を使用して簡単に処理できます。
これは一般的な解決策ではないことは承知していますが、簡単な基盤になるようです。
このようなものには、B クラスでの特別なリストの実装が必要になることに注意してください。一般的なケース (つまり、ArrayList などを使用) で処理できる AOP タイプのソリューションにほかなりません。
また、あなたが達成しようとしているのは、データ バインディングの聖杯のようなものであることも指摘しておく必要があります。フィールド レベルでバインドするための適切な実装 (ゲッターやセッターなど) がいくつかあります (例については、JGoodies バインディングと JSR 295 を参照してください)。また、リスト タイプ バインディングの非常に優れた実装も 1 つあります (上記の Glazed Lists)。私たちは、ほとんどすべてのアプリケーションで両方の手法を相互に連携させて使用していますが、あなたが求めているほど抽象的にしようとしたことはありません.
私がこれを設計しているとしたら、次のようになります。
AssociationBuilder.createAssociation(A a, Connector< A> ca, B b, Connector< B> cb, Synchronizer< A,B> sync)
コネクタは、さまざまな変更通知の種類に対して単一のインターフェイスを可能にするインターフェイスです。Synchronizer は、いずれかのオブジェクトが変更されるたびに、両方のオブジェクトが同期されていることを確認するために呼び出されるインターフェイスです。
sync(ChangeInfo info, A a, B b) // make sure that b reflects current state of a and vice-versa.
ChangeInfo は、どのメンバーが変更されたか、および実際の変更内容に関するデータを提供します。私たちです。このジェネリックを本当に維持しようとしている場合は、これの実装をフレームワークユーザーにパントする必要があります。
上記が整っていれば、さまざまなバインディング基準を満たす、事前定義された多数のコネクターとシンクロナイザーを持つことができます。
興味深いことに、上記のメソッド シグネチャは、JSR 295 の createAutoBinding() メソッド呼び出しと非常によく似ています。プロパティ オブジェクトはコネクタと同等です。JSR 295 には Synchronizer がありません (代わりに、ENUM として指定されたバインディング戦略があります。さらに、JSR 295 はプロパティ -> プロパティ バインディングでのみ機能し、あるオブジェクトのフィールド値を別のオブジェクトのそのオブジェクトのリスト メンバーシップにバインドしようとします。彼らのテーブルにもありません)。