2011-09-27 14 views
9

Play! framework generates getters and setters मॉडल कक्षा के प्रत्येक सार्वजनिक क्षेत्र के लिए रनटाइम पर।प्ले में उत्पन्न गेटर्स और सेटर्स से लाभ! फ्रेमवर्क

public class Product { 

    public String name; 
    public Integer price; 
} 

public class Product { 

    public String name; 
    public Integer price; 

    public String getName() { 
     return name; 
    } 

    public void setName(String name) { 
     this.name = name; 
    } 

    public Integer getPrice() { 
     return price; 
    } 

    public void setPrice(Integer price) { 
     this.price = price; 
    } 
} 

को परिवर्तित हो जाएगा मैनुअल आगे बताते हैं:

फिर जब आप एक संपत्ति का उपयोग करना चाहते हैं तो आप सिर्फ लिख सकते हैं:

product.name = "My product"; 
product.price = 58; 

कौन सा अनुवाद किया है लोड समय पर:

product.setName("My product"); 
product.setPrice(58); 

... और चेतावनी देते हैं:

आप सीधे गुण तक पहुँचने के लिए मनुष्य और सेटर तरीके का उपयोग नहीं कर सकते हैं यदि आप स्वत: पीढ़ी पर निर्भर हैं। ये विधियां रनटाइम पर उत्पन्न होती हैं। इसलिए यदि आप उन्हें लिखने वाले कोड में संदर्भित करते हैं, तो संकलक विधियों को नहीं ढूंढ पाएगा और एक त्रुटि उत्पन्न करेगा।

चूंकि मैं Play के बाहर से इन गेटर्स और सेटर्स का उपयोग नहीं कर सकता! प्रोजेक्ट, मुझे उन्हें उत्पन्न करने में कोई फायदा नहीं होता है। सार्वजनिक क्षेत्रों की तुलना में लाभ क्या है, रिफैक्टरिंग (एक क्षेत्र को समाहित करें और कॉलर्स को बदलें) सभी आधुनिक आईडीई खाते में लिया गया है?

उत्तर

8

संक्षिप्त उत्तर: बीन्स की आवश्यकता होती है।

लंबा: बीन्स विनिर्देश के लिए प्रत्येक आंतरिक क्षेत्र के लिए गेटटर/सेटर की आवश्यकता होती है। मैं 100% निश्चित नहीं हूं, लेकिन मुझे लगता है कि हाइबरनेट और ग्रोवी टेम्पलेट्स दोनों जावा बीन्स (पीओजेओ बीन्स, जावा ईई नहीं!) की अपेक्षा करते हैं, इस प्रकार वे गेटर्स/सेटर्स के लिए पूछेंगे। Play बस आपको ऐसा करने में समय बचाता है, इसलिए आपको बॉयलर-प्लेट कोड से चिंता करने की ज़रूरत नहीं है (जब तक कि आप किसी भी कारण से अपना खुद का गेटटर/सेटर परिभाषित नहीं करना चाहते हैं)।

+0

+1 अच्छा जवाब। मैंने अपने स्वयं के सेटर्स और गेटर्स को परिभाषित करने के बारे में इस बिंदु पर विस्तार किया है क्योंकि मुझे लगता है कि यह वास्तव में एक महत्वपूर्ण बिंदु है। – Codemwnci

8

एक और कारण, हालांकि आपको सेटर्स और गेटर्स निर्दिष्ट करने की आवश्यकता नहीं है, फिर भी आप कर सकते हैं!

तो, आप (अपने उदाहरण के अनुसार) है, तो

product.name = "my product" 

यह ठीक है, और अपने कोड तेज बनाता है और पढ़ने में आसान मेरी राय में। हालांकि, encapsulation के लिए सेटर्स और गेटर्स के लिए एक अच्छा कारण है। यदि आप अपना उत्पाद नाम बदलते समय कुछ तर्क जोड़ना चाहते हैं, तो आप अपना खुद का सेटर निर्दिष्ट कर सकते हैं, लेकिन आपको ऊपर दिए गए कोड को बदलने की ज़रूरत नहीं है, क्योंकि यह दृश्यों के पीछे सेटटर को कॉल करना जारी रखेगा।

तो, यह आपको अच्छी encapsulation की लचीलापन और शक्ति देता है, लेकिन सीधी क्षेत्र के उपयोग की स्वच्छता और पठनीयता।

मेरी राय यह दोनों दुनिया के सर्वश्रेष्ठ है।

+0

लेकिन चूंकि "गुण" केवल उसी प्ले के भीतर उपलब्ध हैं! प्रोजेक्ट मैं आसानी से अपने आईडीई से एक रिफैक्टरिंग का उपयोग कर सकता हूं। – deamon

+0

हां, लेकिन फिर आप पठनीयता पर हार जाते हैं। जहां यह वास्तव में मुझे खोजने में मदद करता है, टेम्पलेट्स में है। – Codemwnci

0

यदि आपके पास निजी गेटटर/सेटर विधि है, तो यह काम नहीं करेगा क्योंकि एक ही नाम के साथ सार्वजनिक गेटर/सेटर विधि बनाना संभव नहीं है। तो यह रन टाइम पर असफल हो जाएगा!

संबंधित मुद्दे