14

Qual è la differenza tra @Delegate e @Mixin Trasformazioni AST in Groovy.Differenza tra @Delegate e @Mixin Trasformazioni AST in Groovy

Forse la mia domanda ha a che fare con OO e quando si applicano modelli diversi, ma io li uso entrambi e posso ottenere lo stesso comportamento.

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" 

risposta

15

Il comportamento è simile, ma @Delegate e @Mixin sono implementate in modo completamente diverso.

@Delegate genera metodi di accesso in fase di compilazione. Il supereroe avrà un metodo chiamato walk() che chiama semplicemente person.walk(). I metodi generati possono essere visti scaricando il file di classe Superhero con javap.

@Mixin, d'altra parte crea solo un piccolo stub che si mescola nei metodi Person in fase di esecuzione. Usa il protocollo metaoggetto di Groovy per consentire a Superhero di rispondere ai metodi di Person. In questo caso, non vedrai metodi Person in Superhero.class.

@Delegate ha il vantaggio che i metodi sono richiamabili da Java ed evita di eseguire un'invocazione dinamica. Inoltre, @Mixin non può aumentare la classe con le proprietà.