2017-07-04 4 views
0

Mon problème est que j'ai affaire à 2 hiérarchies d'objets générées par jaxb. Les objets ont le même nom et 99,9% la même structure, mais ils sont dans des emballages différents:Existe-t-il un moyen de réutiliser le code si mes objets ont une hiérarchie différente?

xy.z.fpml.transparency.IdentifiedCurrency 
xy.z.fpml.recordkeeping.IdentifiedCurrency 

Comme vous pouvez l'imaginer, je ne peux pas modifier les objets et ils ont rien en commun que je peux créer un lien vers, non superclasse ou interface, etc

IntelliJ dit que c'est du code en double mais j'ai les mains liées. Est-il possible de faire une sorte de méthode générique qui acceptera les deux types d'objets? Peut-être une réflexion? (Je ne peux pas ...)

+0

Si vous pouvez donner à JAXB un schéma personnalisé, vous pouvez créer un troisième schéma avec les parties communes et refixer les deux autres schémas pour inclure le troisième. Cela devrait forcer le code généré pour chacun des deux premiers schémas à inclure une référence à un objet du type composé commun. –

+1

Attendez, ce code est généré. Pourquoi est-ce que tu t'en préoccupes? Est-ce juste parce qu'intellij vous dit de vous en soucier? –

+0

Je travaille sur une application existante. J'ai trouvé mon moi ayant 2 paquets séparés avec 99% le même code (transparence et tenue de dossiers). Chaque paquet utilise l'une des hiérarchies d'objets générés par jaxb. Au début, j'ai dit OK, je vais juste extraire dans une super-classe. Alors je ne peux pas, les classes utilisées comme arguments viennent de jaxb, ont le même nom mais sont dans des paquets différents et j'ai environ 10 classes qui sont 'dupliquées' et doivent être maintenues ... donc je veux les unir si je peux –

Répondre

1

Si les classes proviennent de jaxb alors vous devez probablement conserver leur source, un document XSD ou un schéma, et non les classes générées elles-mêmes.

Si le problème concerne uniquement les avertissements IDE, ajoutez une exception pour ce cas et ignorez-les.

+0

Par exemple j'ai une classe avec cette méthode: 'private IdentifiedCurrency getIdentifiedCurrency (Valeur de chaîne) { IdentifiedCurrency ccy = new IdentifiedCurrency(); ccy.setCurrencyScheme (HTTP_SCHEME); identifyCurrency.setValue (value); retour ccy; } 'Mais j'ai la même méthode dans une autre classe en utilisant la devise identifiée de l'autre hiérarchie.5k lignes sont dans cet état –

0

Je pense que la seule façon d'éviter la duplication de code est d'utiliser Dozer ou BeanUtils pour faire une copie en profondeur de l'objet.

private xy.z.fpml.transparency.IdentifiedCurrency getIdentifiedCurrency(String value) { 
    xy.z.fpml.transparency.IdentifiedCurrency identifiedCurrency = new IdentifiedCurrency(); 
    identifiedCurrency.setCurrencyScheme(SCHEMA); 
    identifiedCurrency.setValue(value); 
    return identifiedCurrency; 
} 

private xy.z.fpml.recordkeeping.IdentifiedCurrency getIdentifiedCurrency(String value) { 
    xy.z.fpml.transparency.IdentifiedCurrency currency = getIdentifiedCurrency(value); 
    xy.z.fpml.recordkeeping.IdentifiedCurrencycurrency copy = new ...(); 
    BeanUtils.copyProperties(currency , copy); 
    return identifiedCurrency; 
} 

Pour la deuxième hiérarchie, je vais juste avoir une autre méthode appelant la première et copiant les résultats. Ce que j'ai ajouté est juste un exemple simple, cela peut sembler être un surcoût puisque nous avons le même nombre de lignes, mais il y a des méthodes dupliquées avec 50-100 lignes et au total il y a toute une hiérarchie dupliquée.

Pensez-vous qu'il existe une meilleure approche à ce sujet?