как да добавяте статични методи с помощта на groovy mixin

Искам да използвам функцията mixin на groovy за импортиране на методи като "класови (статични) методи" вместо методи на екземпляри. Когато използвам mixin, въпреки че имам статичен метод в моя клас mixin, той се преобразува в метод на екземпляр в целевия клас. Искам импортираният метод да бъде метод на клас (статичен). Има ли добър начин да го направя?


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


Отговори (3)


Не знам за някакъв начин за добавяне на статични методи към клас с помощта на миксини, но можете да добавите статични методи към клас чрез свойството metaClass.static. Ето пример, който добавя статичен fqn() метод, който отпечатва пълното име на клас

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

Ако искате да добавите fqn() (и други статични методи) към няколко класа (напр. Списък, Файл, Скенер), можете да направите нещо като

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