【问题标题】:Difference between @Delegate and @Mixin AST transformations in GroovyGroovy 中 @Delegate 和 @Mixin AST 转换之间的区别
【发布时间】:2011-12-15 22:24:52
【问题描述】:

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"

【问题讨论】:

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


    【解决方案1】:

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

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

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

    @Delegate 的优点是这些方法可以从 Java 中调用,并且避免了动态调用。此外,@Mixin 不能用属性扩充类。

    【讨论】:

      猜你喜欢
      • 2014-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-13
      相关资源
      最近更新 更多