2010-03-22 10 views
4

Je veux utiliser la fonction mixin de groovy pour importer des méthodes en tant que "méthodes class (statiques)" au lieu de méthodes d'instance. Quand j'utilise mixin même si j'ai une méthode statique dans ma classe mixin, elle est convertie en une méthode d'instance dans la classe de destination. Je veux que la méthode importée soit une méthode de classe (statique). Y at-il un bon moyen de le faire?comment ajouter des méthodes statiques en utilisant groovy mixin

Répondre

3

Je ne connais aucun moyen d'ajouter des méthodes statiques à une classe en utilisant des mixins, mais vous pouvez ajouter des méthodes statiques à une classe via la propriété metaClass.static. Voici un exemple qui ajoute une méthode fqn() statique qui imprime le nom complet d'une classe

Class.metaClass.static.fqn = { delegate.name } 
assert String.fqn() == "java.lang.String" 

Si vous voulez ajouter fqn() (et d'autres méthodes statiques) à plusieurs classes (par exemple la liste, fichiers, scanner), vous pourriez faire quelque chose comme

def staticMethods = [fqn: {delegate.name}, fqnUpper: {delegate.name.toUpperCase()}]  

[List, File, Scanner].each { clazz -> 

    staticMethods.each{methodName, methodImpl -> 
     clazz.metaClass.static[methodName] = methodImpl 
    } 
} 
1

J'ai répondu de la même manière que Don.

Voici ce que j'ai fait pour contourner le problème de mixin statique avec les fermetures que je voulais @Mixin.

Class Foo { 

    static a = {} 
    static b = {} 
    static c = {} 
} 

Class Bar {} 

def meths = Foo.metaClass.properties.findAll{it.type==Object}.collect{it.name} 
meths.each {Bar.metaClass.static."$it" = A."$it"}