A moins abstraite les setters, vous allez devoir fournir une sorte de mécanisme de notification d'événements. Si vos objets sont JavaBeans, vous envisagez d'utiliser PropertyChangeSupport et de déclencher des événements de changement de propriété.
Si vous faites cela (ou avez un autre mécanisme pour détecter les changements), alors Glazed Lists fournit un ObservableElementList qui pourrait facilement être utilisé pour gérer la synchronisation d'association de la fin de la liste (par exemple ajouter A à List < A> a.setB (b)). L'autre direction est facilement manipulée en utilisant la surveillance des changements de propriété (ou équivalent). Je me rends compte que ce n'est pas une solution générique, mais il semble que ce serait une base facile pour l'un.
Notez que quelque chose comme cela besoin une liste spéciale mise en œuvre dans la classe B - aucun moyen à court de solutions de type AOP que vous pouvez le manipuler dans le cas général (à savoir en utilisant ArrayList ou quelque chose comme ça).
Je devrais également souligner que ce que vous essayez d'accomplir est quelque chose du Saint-Graal de la liaison de données. Il existe quelques implémentations décentes pour la liaison au niveau du terrain (des choses comme les getters et les setters) (voir JGoodies binding et JSR 295 pour des exemples). Il y a aussi une implémentation vraiment bonne pour la liaison de type liste (Glazed Lists, mentionnée ci-dessus). Nous utilisons les deux techniques de concert dans presque toutes nos applications, mais nous n'avons jamais essayé d'aller aussi abstrait que ce que vous demandez.
Si je concevais cela, je regardais quelque chose comme ceci:
AssociationBuilder.createAssociation(A a, Connector< A> ca, B b, Connector< B> cb, Synchronizer< A,B> sync)
Connector est une interface qui permet une interface unique pour différents types de notification de changement. Synchronizer est une interface appelée pour s'assurer que les deux objets sont synchronisés chaque fois que l'un d'entre eux est modifié. ChangeInfo fournit des données sur quel membre a changé, et quelles étaient les modifications en réalité. Nous sommes. Si vous essayez vraiment de garder ce générique, alors vous avez à peu près mettre l'implémentation de ce à l'utilisateur du cadre.
Avec ce qui précède, il serait possible d'avoir un certain nombre de connecteurs et de synchroniseurs prédéfinis répondant à différents critères de liaison.
Fait intéressant, la signature de méthode ci-dessus est assez similaire à l'appel de méthode JSR 295 createAutoBinding(). Les objets de propriété sont l'équivalent de Connector. JSR 295 n'a pas le Synchronizer (à la place, ils ont une stratégie de liaison spécifiée comme ENUM - plus JSR 295 fonctionne uniquement avec property-> property binding, essayant de lier une valeur de champ d'un objet à l'appartenance de la liste dans un autre objet n'est même pas sur la table pour eux).
Merci pour la réponse, mais je cherchais une solution qui traite de ceci d'une manière générique, sans code-instructif. –