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
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
}
}
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"}
J'espère qu'il sera possible à l'avenir, cela signifie que, lorsque ce bug sera corrigé: http://jira.codehaus.org/browse/GROOVY-4370 (mixin une classe avec des méthodes statiques ne fonctionne pas correctement)