14

Sự khác nhau giữa các phép biến đổi @Delegate@Mixin AST trong Groovy là gì.Sự khác biệt giữa các phép biến đổi @Delegate và @Mixin AST trong Groovy

Có lẽ câu hỏi của tôi phải làm với OO và khi áp dụng các mẫu khác nhau, nhưng tôi sử dụng cả hai và tôi có thể đạt được hành vi tương tự.

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" 

Trả lời

15

Các hành vi tương tự, nhưng @Delegate@Mixin được thực hiện hoàn toàn khác nhau.

@Delegate tạo phương thức truy cập tại thời gian biên dịch. Siêu anh hùng sẽ có một phương pháp gọi là walk() mà chỉ cần gọi person.walk(). Bạn có thể xem các phương thức được tạo bằng cách bán phá giá tệp lớp Superhero với javap.

@Mixin, mặt khác chỉ cần tạo một cuống nhỏ trộn lẫn trong các phương pháp Person khi chạy. Nó sử dụng giao thức siêu đối tượng của groovy để cho phép Superhero trả lời các phương thức của Person. Trong trường hợp này, bạn sẽ không thấy bất kỳ phương thức nào của Người theo số Superhero.class.

@Delegate có lợi thế là các phương thức này có thể gọi được từ Java và tránh được thực hiện lời gọi động. Ngoài ra, @Mixin không thể tăng thêm lớp học với các thuộc tính.

Các vấn đề liên quan