Groovy MetaClass - добавляет методы категорий в соответствующие метаклассы - PullRequest
1 голос
/ 05 марта 2010

У меня есть несколько категорий, которые я использую в своем плагине Grails. например.,

class Foo {
    static foo(ClassA a,Object someArg) { ... }
    static bar(ClassB b,Object... someArgs) { ... }
}

Я ищу лучший способ добавить эти методы в мета-классы, чтобы мне не приходилось использовать классы категорий, и я мог просто вызывать их как методы экземпляра. например.,

aInstance.foo(someArg)

bInstance.bar(someArgs)

Есть ли класс или метод Groovy / Grails, которые помогут мне сделать это, или я застрял, перебирая методы и добавляя их все сам?

1 Ответ

4 голосов
/ 05 марта 2010

В Groovy 1.6 был представлен гораздо более простой механизм использования категорий / миксинов. Ранее методы класса категории должны были быть объявлены как статические, а первый параметр указывает, к какому классу объектов они могут быть применены (как в вашем классе Foo выше).

Я нахожу это несколько неловким, потому что как только методы категории «смешиваются» с целевым классом, они становятся нестатичными, но в классе категории они являются статическими.

В любом случае, начиная с Groovy 1.6, вы можете сделать это вместо

// Define the category
class MyCategory {
  void doIt() {
    println "done"
  }

  void doIt2() {
    println "done2"
  }
}

// Mix the category into the target class
@Mixin (MyCategory)
class MyClass {
   void callMixin() {
     doIt()
   }
}

// Test that it works
def obj = new MyClass()
obj.callMixin()

Доступны несколько других функций. Если вы хотите ограничить классы, к которым может быть применена категория, используйте аннотацию @Category. Например, если вы хотите применить MyCategory к MyClass (или его подклассам), определите его как:

@Category(MyClass)
class MyCategory {
  // Implementation omitted
}

Вместо того, чтобы смешивать категории во время компиляции, используя @Mixin (как указано выше), вы можете смешивать их во время выполнения, вместо этого используя:

MyClass.mixin MyCategory

Если вы используете Grails, Bootstrap.groovy - это место, где вы можете сделать это.

...