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

Art*_*ero 14 groovy design-patterns delegation abstract-syntax-tree 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"
Run Code Online (Sandbox Code Playgroud)
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"
Run Code Online (Sandbox Code Playgroud)

ata*_*lor 16

该行为是相似的,但@Delegate@Mixin实现完全不同.

@Delegate在编译时生成访问器方法.超级英雄将有一个叫做walk()简单调用的方法person.walk().通过转储Superhero类文件可以看到生成的方法javap.

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

@Delegate具有以下优点:方法可以从Java调用,并且它避免了进行动态调用.另外,@Mixin不能用属性来扩充类.