1

Grailsプラグインで使用するカテゴリがいくつかあります。例えば、

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

これらのメソッドをメタクラスに追加して、カテゴリクラスを使用する必要がなく、インスタンスメソッドとして呼び出すことができるようにするための最良の方法を探しています。例えば、

aInstance.foo(someArg)

bInstance.bar(someArgs)

これを行うのに役立つGroovy/Grailsクラスまたはメソッドはありますか、それともメソッドを繰り返し処理してすべて自分で追加することに固執していますか?

4

1 に答える 1

4

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アノテーションを使用します。たとえば、(またはそのサブクラスに)のみ適用する場合は、次MyCategoryMyClassように定義します。

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

@Mixin(上記のように)を使用してコンパイル時にカテゴリを混合する代わりに、次を使用して実行時にカテゴリを混合することができます。

MyClass.mixin MyCategory

Grailsを使用している場合、Bootstrap.groovyこれを行う可能性のある場所です。

于 2010-03-05T15:25:13.697 に答える