Разница между преобразованиями @Delegate и @Mixin AST в Groovy - PullRequest
14 голосов
/ 16 декабря 2011

В чем разница между @ Delegate и @ Mixin AST-преобразованиями в Groovy.

Может быть, мой вопрос касается 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"

1 Ответ

16 голосов
/ 16 декабря 2011

Поведение аналогично, но @Delegate и @Mixin реализованы совершенно по-разному.

@Delegate генерирует методы доступа во время компиляции. У супергероя будет метод с именем walk(), который просто вызывает person.walk(). Сгенерированные методы можно увидеть, выгрузив файл класса Superhero с javap.

@Mixin, с другой стороны, просто создает небольшую заглушку, которая смешивается в методах Person во время выполнения. Он использует мета-объектный протокол groovy, чтобы Superhero мог реагировать на методы Person. В этом случае вы не увидите никаких методов Person в Superhero.class.

@Delegate имеет то преимущество, что методы могут вызываться из Java, и это позволяет избежать динамического вызова. Кроме того, @Mixin не может дополнить класс свойствами.

...