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

时间:2011-12-15 22:24:52

标签: groovy design-patterns abstract-syntax-tree delegation mixins

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"

1 个答案:

答案 0 :(得分:16)

行为类似,但@Delegate@Mixin的实现完全不同。

@Delegate在编译时生成访问器方法。超级英雄将有一个名为walk()的方法,只需调用person.walk()。通过使用javap转储Superhero类文件可以看到生成的方法。

另一方面,

@Mixin只创建一个在运行时混合Person方法的小存根。它使用groovy的元对象协议来允许Superhero响应Person的方法。在这种情况下,您不会在Superhero.class中看到任何Person方法。

@Delegate的优点是方法可以从Java调用,并且避免了进行动态调用。此外,@Mixin无法使用属性扩充类。