14

@Delegate@Mixinの違いは何ですか?@Delegateと@Mixinの違いGroovyのAST変換

多分私の質問はオブジェクト指向と関係があり、異なるパターンを適用する場合は、私は両方を使用し、同じ動作を達成することができます。

class Person { 
    String name = "Clark" 
    def walk() { "Walk" } 
} 

@Mixin(Person) 
class Superhero { 
    def fly() { "Fly" } 
} 

def superman = new Superhero() 
assert superman.name == "Clark" 
assert superman.walk() == "Walk" 
assert superman.fly() == "Fly" 

class Person { 
    String name = "Clark" 
    def walk() { "Walk" } 
} 

class Superhero { 
    @Delegate Person person 
    def fly() { "Fly" } 
} 

def superman = new Superhero(person: new Person()) 
assert superman.name == "Clark" 
assert superman.walk() == "Walk" 
assert superman.fly() == "Fly" 

答えて

15

挙動は似ていますが、@Delegate@Mixinは完全に異なる方法で実装されています。

@Delegateは、コンパイル時にアクセサメソッドを生成します。スーパーヒーローにはwalk()というメソッドがあり、単にperson.walk()と呼ばれます。生成されたメソッドは、javapというスーパーヒロクラスファイルをダンプすることによって見ることができます。

@Mixinは、実行時にPersonのメソッドに混在する小さなスタブを作成するだけです。 Groovyのメタオブジェクトプロトコルを使用して、SuperheroがPersonメソッドに応答できるようにします。この場合、Superhero.classにPersonメソッドは表示されません。

@Delegateは、メソッドがJavaから呼び出し可能であり、動的呼び出しを実行しないという利点があります。また、@Mixinは、プロパティを持つクラスを拡張することはできません。

関連する問題