2010-03-05 7 views
1

J'ai plusieurs catégories que j'utilise dans mon plugin Grails. par exemple,Groovy MetaClass - Ajouter des méthodes de catégorie aux métaClasses appropriées

class Foo { 
    static foo(ClassA a,Object someArg) { ... } 
    static bar(ClassB b,Object... someArgs) { ... } 
} 

Je suis à la recherche de la meilleure façon d'ajouter ces méthodes aux méta-classes afin que je ne dois pas utiliser les classes de catégorie et ne peut que les invoquer comme méthodes d'instance. par exemple,

aInstance.foo(someArg) 

bInstance.bar(someArgs) 

Y at-il une classe Groovy/Grails ou une méthode qui me aider à faire cela ou que je itérer coincé par les méthodes et les ajouter moi-même?

Répondre

4

Dans Groovy 1.6, un mécanisme beaucoup plus simple d'utilisation des catégories/mixins a été introduit. Auparavant, les méthodes d'une classe de catégorie devaient être déclarées statiques et le premier paramètre indiquait la classe d'objets à laquelle elles pouvaient être appliquées (comme dans votre classe Foo ci-dessus). Je trouve cela quelque peu gênant car une fois que les méthodes de la catégorie sont "mélangées" à la classe cible, elles ne sont pas statiques, mais dans la catégorie elles sont statiques.

Quoi qu'il en soit, depuis Groovy 1.6 vous pouvez le faire à la place

// Define the category 
class MyCategory { 
    void doIt() { 
    println "done" 
    } 

    void doIt2() { 
    println "done2" 
    } 
} 

// Mix the category into the target class 
@Mixin (MyCategory) 
class MyClass { 
    void callMixin() { 
    doIt() 
    } 
} 

// Test that it works 
def obj = new MyClass() 
obj.callMixin() 

Quelques autres fonctionnalités sont disponibles. Si vous souhaitez limiter les classes auxquelles la catégorie peut être appliquée, utilisez l'annotation @Category. Par exemple, si vous ne souhaitez appliquer MyCategory à MyClass (ou il est sous-classes), définissez comme:

@Category(MyClass) 
class MyCategory { 
    // Implementation omitted 
} 

Au lieu de mélanger les catégories à la compilation en utilisant @Mixin (comme ci-dessus), vous pouvez les mélanger à l'exécution en utilisant à la place:

MyClass.mixin MyCategory 

en vous utilisez Grails, Bootstrap.groovy est un endroit où vous pourriez le faire.

Questions connexes