uehaj's blog

Grな日々 - GroovyとかGrailsとかElmとかRustとかHaskellとかReactとかFregeとかJavaとか -

@Mixinの例が変だぞ

http://groovy.codehaus.org/Category+and+Mixin+transformations
とか
http://www.infoq.com/articles/groovy-1-6
にある@Mixin/@Categoryの例が変に思われる。

@Category(Vehicle)
class FlyingAbility {
    def fly() { "I'm the ${name} and I fly!" }
}

@Category(Vehicle)
class DivingAbility {
    def dive() { "I'm the ${name} and I dive!" }
}

とあるけど、ここでの@Categoryは無くても動く。

@Categoryはインスタンスメソッドをstaticメソッドに転換する働きを持ちます。useとかでつかう形式のためにね。DGMの形式にする。

しかし、@Mixinは、インスタンスメソッドをそのまま取り込む働きがあるので、static化は不要なはず。逆に、@Categoryで展開された静的メソッドをmixinでとりこんだときどうなるかには疑問があるね。呼べるには呼べるようだけど、その呼び出す際の動きには奇妙なところがあるなあ*1

とゆーことで、@Mixinと@Categoryは別目的のものであり、ペアで扱っちゃいけないのだ。本来なら。

ちなみに@Mixinアノテーションをつけることはクラスの静的イニシャライザでmixin()メソッドを呼ぶのと同じです。@Grabアノテーションをつけることがgrab()メソッドが裏方さんで呼ばれるのと同じですね。

*1:1回インスタンス経由で静的メソッドを呼ぶとクラスを指定して静的メソッドが呼べるようになる、など。最初からは呼べない。