14

Groovy中@Delegate@Mixin AST转换之间的区别。Groovy中@Delegate和@Mixin AST转换之间的区别

也许我的问题与OO有关,当应用不同的模式时,但我使用两者,我可以实现相同的行为。

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不能用属性来增加类。