Подтвердить что ты не робот

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

Какая разница между @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"
4b9b3361

Ответ 1

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

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

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

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