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无法使用属性来增加类. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |