2010-09-17 12 views
3

Si je mets:Aspectj. Création de méthodes de type Innter dans plusieurs classes

public CountryState CountryState.find(long id) { 
     return (CountryState) findById(CountryState.class, id); 
} 

Je crée une méthode trouve dans la CountryState de classe.

Existe-t-il un moyen de créer une méthode dans plusieurs classes? Ai-je besoin de répéter le code pour chaque classe que je veux créer?

Je sais qu'avec l'aspect je peux faire hériter une classe d'une autre, mais, ce faisant, je peux créer une super-classe car java n'accepte pas l'héritage multiple.

Répondre

5

Ce « modèle » est la façon dont vous le faites dans AspectJ.

Déclare une interface:

interface Holder {} 

Faites vos déclarations Intertype sur l'interface:

public int Holder.getMeAnInt() { 
    return 42; 
} 

Lorsque vous faites une déclaration comme celle sur une interface que vous fournissez une 'implémentation par défaut'. Donc, l'interface va maintenant définir getMeAnInt() et toutes les implémentations de Holder qui n'implémentent pas getMeAnInt() recevront l'implémentation par défaut.

La dernière pièce du puzzle est alors d'utiliser déclarer les parents de préciser quel groupe de types mettre en œuvre votre interface:

declare parents: @Anno * implements Holder; 

Alors maintenant, tout type annoté avec @Anno mettra en œuvre Holder et ont le getMeAnInt () méthode.

+0

Andy, c'est exactement ce dont j'ai besoin. Parfait! Merci beaucoup! –

0

Vous pouvez réellement le résoudre sans utiliser AOP. Vous pouvez simplement utiliser OOP/OOD. Il y a deux façons (je suppose que vous voulez écrire une fois la méthode):

  1. Créer une classe abstraite de base avec la mise en œuvre de la méthode et d'en tirer toutes les classes de celui-ci. Ce n'est pas la meilleure idée, en fait.

  2. Création d'une classe auxiliaire qui implémentera votre méthode find() et la partagera entre les classes (soit en utilisant Dependency Injection, soit en les couplant étroitement).

Donc, si je comprends bien, ce que vous voulez est en fait une méthode générique qui retournera les instances de la classe cible:

public <T> find(long id, T targetClassObject) { 
    Class<? extends T> class = targetClassObject.getClass(); 
    // do something i.e. call target method via reflection 
} 
+0

S'il vous plaît, voir mon deuxième post.http: //stackoverflow.com/questions/3738545/aspectj-creating-innter-type-methods-in-multiple-classes –