14

में @ डीलेगेट और @ मिक्सिन एएसटी रूपांतरणों के बीच अंतर @Delegate और @Mixin ग्रोवी में एएसटी रूपांतरणों के बीच क्या अंतर है।ग्रोवी

शायद मेरे प्रश्न को ओओ के साथ करना है और विभिन्न पैटर्न लागू करते समय, लेकिन मैं दोनों का उपयोग करता हूं और मैं वही व्यवहार प्राप्त कर सकता हूं।

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" 

उत्तर

15

व्यवहार समान है, लेकिन @Delegate और @Mixin पूरी तरह से अलग तरह से लागू किया जाता है।

@Delegate संकलन समय पर एक्सेसर विधियों को उत्पन्न करता है। सुपरहीरो में walk() नामक एक विधि होगी जो बस person.walk() पर कॉल करेगी। जेनरेटेड विधियों को javap के साथ सुपरहीरो क्लास फ़ाइल डंप करके देखा जा सकता है।

@Mixin, दूसरी तरफ, रनटाइम पर Person विधियों में मिश्रित एक छोटा स्टब बनाता है। यह सुपरहीरो को व्यक्ति के तरीकों का जवाब देने की अनुमति देने के लिए ग्रोवी के मेटा-ऑब्जेक्ट प्रोटोकॉल का उपयोग करता है। इस मामले में, आपको Superhero.class में कोई भी व्यक्ति विधि नहीं दिखाई देगी।

@Delegate का लाभ यह है कि विधियां जावा से कॉल करने योग्य हैं और यह गतिशील आमंत्रण करने से बचाती है। इसके अलावा, @Mixin गुणों के साथ वर्ग को बढ़ा नहीं सकता है।