加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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无法使用属性来增加类.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读