как добавить статические методы с помощью groovy mixin

Я хочу использовать функцию миксина groovy для импорта методов как «методов класса (статических)» вместо методов экземпляра. Когда я использую миксин, даже если у меня есть статический метод в моем классе миксина, он преобразуется в метод экземпляра в целевом классе. Я хочу, чтобы импортированный метод был методом класса (статическим). Есть ли хороший способ сделать это?


person prabha    schedule 22.03.2010    source источник


Ответы (3)


Я не знаю, как добавить статические методы в класс с помощью примесей, но вы можете добавить статические методы в класс через свойство metaClass.static. Вот пример, который добавляет статический метод fqn(), который печатает полное имя класса.

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

Если вы хотите добавить fqn() (и другие статические методы) к нескольким классам (например, List, File, Scanner), вы можете сделать что-то вроде

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

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

    staticMethods.each{methodName, methodImpl ->
        clazz.metaClass.static[methodName] = methodImpl
    }
}
person Dónal    schedule 22.03.2010

Я поставил +1 к ответу Дона выше.

Вот что я сделал, чтобы обойти проблему статического миксина с замыканиями, которые я хотел @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"}
person virtualeyes    schedule 06.03.2011

Я надеюсь, что это будет возможно в будущем, то есть когда эта ошибка будет исправлена: http://jira.codehaus.org/browse/GROOVY-4370 (смешение класса со статическими методами не работает должным образом)

person Jakub    schedule 23.08.2011