Как добавить статические методы с помощью Groovy Mixin - PullRequest
4 голосов
/ 22 марта 2010

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

Ответы [ 3 ]

3 голосов
/ 22 марта 2010

Я не знаю ни одного способа добавления статических методов в класс с помощью mixins, но вы можете добавить статические методы в класс через свойство 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
    }
}
1 голос
/ 06 марта 2011

Я +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"}
0 голосов
/ 23 августа 2011

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

...