Groovy中@Delegate和@Mixin AST转换之间的区别
发布时间:2020-12-14 16:35:40  所属栏目:大数据  来源:网络整理 
            导读:Groovy中的 @Delegate和 @Mixin AST转换有什么区别? 也许我的问题与OO有关,当应用不同的模式,但是我使用两者,我可以实现相同的行为. class Person { String name = "Clark" def walk() { "Walk" }}@Mixin(Person)class Superhero { def fly() { "Fly" }}def
                
                
                
            | 
 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"解决方法
 行为是类似的,但是@Delegate和@Mixin的实现方式完全不一样. 
  
  @Delegate在编译时生成访问器方法.超级英雄将会有一个名为walk()的方法,只需调用person.walk().通过使用javap转储Superhero类文件可以看出生成的方法. @Mixin,另一方面只是创建一个小的存根,在运行时在Person方法中混合使用.它使用groovy的元对象协议来允许超级英雄回应人的方法.在这种情况下,您将在Superhero.class中看不到任何Person方法. @Delegate具有这样的优点:该方法可以从Java调用,并且避免了进行动态调用.另外,@Mixin无法使用属性来增加类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! | 
