2011-06-08 11 views
19

मुझे समझ में नहीं आ रहा है कि जेएसआर 303 (बीन सत्यापन) गेटटर विधियों के लिए क्यों नहीं है और सेटटर नहीं है? क्या इसे सेटटर विधि के तहत रखना अधिक तर्कसंगत नहीं है क्योंकि यह एक क्षेत्र में प्रवेश बिंदु है और इससे पहले सत्यापन की जांच की जानी चाहिए?जेएसएफ: जेएसआर 303 बीन प्रमाणीकरण - गेटटर पर क्यों नहीं और सेटटर नहीं?

+2

मुझे समझ में नहीं आता कि आप मैदान के बजाय गेटटर पर बाधा डाल रहे हैं। क्या यह क्षेत्र में खुद को रखने के लिए और अधिक तार्किक नहीं है, ठीक है, एकमात्र क्षेत्र ही है? – BalusC

+0

@ बाल्लूसी याप! मैं आपसे सहमत हुँ। तो सवाल यह है कि अगर मैं उस क्षेत्र पर सत्यापन करता हूं, तो क्या मुझे उस क्षेत्र गेटटर विधि पर एनोटेशन लगाने की भी आवश्यकता है? यदि नहीं, तो गेटटर विधि के लिए बिल्कुल एनोटेशन क्यों है? – yapkm01

उत्तर

5

यह एक बहुत अच्छा सवाल और कुछ है जिस पर मैंने कभी ध्यान नहीं दिया है। लेकिन मुझे लगता है कि मुझे जवाब पता है (और मुझे यह सवाल क्यों नहीं मिला)।

यदि आप इसे देख रहे हैं, तो यह देखते हुए कि एनोटेशन परिभाषित करता है कि सत्यापन कहां होगा, फिर इसे गेटर पर डालने से कोई अर्थ नहीं होता है। (मान को संग्रहीत करते समय मान्य क्यों नहीं है ..)। लेकिन ऐसा नहीं है कि यह कैसे काम करता है ...

प्रोग्रामर को सत्यापन ढांचे को बताने की आवश्यकता है, जिन्हें गुणों को सत्यापित करने की आवश्यकता है। तो आप एनोटेशन को सीधे विशेषता (जिसे मैं पसंद करता हूं) पर डाल सकता हूं या आप इसे गेटर पर डाल सकते हैं। उनमें से दोनों पढ़ने के ऑपरेशन को इंगित करते हैं। फ्रेमवर्क को आपकी कक्षा के सभी विशेषताओं को पढ़ने की आवश्यकता है, जिन्हें सत्यापित किया जाना होगा। तो इस मामले में, सेटटर डालने पर कोई मतलब नहीं है .. समझने की कुंजी परिप्रेक्ष्य है ...

मुझे उम्मीद है कि यह समझ में आता है।

+0

हां, अगर आप इसे इस तरह देखते हैं तो यह समझ में नहीं आता है।मुझे लगता है कि गेटटर पर आपकी एनोटेशन की स्थिति नहीं है, गेटर पर सत्यापन करता है। हम उस विशेषता को चिह्नित कर रहे हैं जैसे फ्रेमवर्क को सत्यापित करने की आवश्यकता है। –

+0

मैं समझता हूं कि आप क्या कहने की कोशिश कर रहे हैं। जहां तक ​​मैं जेएसएफ जीवन चक्र के बारे में समझता हूं, यदि प्रक्रिया सत्यापन चरण के दौरान सत्यापन त्रुटि है, तो वही पृष्ठ फिर से चलाया जाता है। सत्यापन करने के लिए एक सेटर विधि लागू नहीं की जानी चाहिए? एक गेटटर विधि केवल पृष्ठ प्रतिपादन चरण पर ही लागू होती है। पृष्ठ प्रतिपादन चरण पर सत्यापन क्यों करें? जिस तरह से मैं इसे देखता हूं, इस चरण में सत्यापन करने के लिए व्यर्थ है .. ठीक है अब सब अच्छा है और इसलिए कहा गया पृष्ठ प्रदर्शित करने के लिए प्रस्तुत किया गया है। – yapkm01

+0

ऐसा इसलिए है क्योंकि ऐसे मामले हैं जहां कोई सेटटर विधि नहीं है। सेटर को केवल पढ़ने वाली संपत्ति पर शामिल नहीं किया जाएगा। – ialexander

19

गेटर्स को एनोटेट करने का मतलब यह नहीं है कि गेटटर लागू होने पर सत्यापन किया जाता है। इसका उपयोग उस संपत्ति की पहचान करने के लिए किया जाता है जिस पर एक बाधा लागू होगी।

इसके बजाए (आमतौर पर निजी) फ़ील्ड (आमतौर पर निजी) फ़ील्ड पर बाधा डालने का बड़ा लाभ यह है कि बाधाएं इस तरह के सार्वजनिक एपीआई का हिस्सा हैं। वे जेनरेट किए गए जावाडोक में भी जोड़े जाएंगे। एक प्रकार का उपयोगकर्ता जानता है कि जिस तरह से बाधाएं इसके आंतरिक कार्यान्वयन को देखे बिना लागू होती हैं।

एनोटेटिंग गेटर्स का एक अन्य लाभ यह है कि बाधाओं को बेस क्लास या इंटरफेस पर विधियों पर रखा जा सकता है और किसी भी उप-प्रकार/कार्यान्वयन के लिए भी आवेदन किया जा सकता है। बस क्षेत्र को देख private String name;

से अधिक एनोटेशन आसानी से क्षेत्र की पहचान करता है

public class BeanValidation { 

    private int nameSetCount = 0; 
    private int nameGetCount = 0; 
    private String name; 

    public String getName() { 
     this.nameGetCount++; 
     return name; 
    } 

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

} 

रखें एनोटेशन:

+0

यदि ऐसा है, तो सार्वजनिक सेटर विधि पर बाधाओं को डालने पर मुझे कोई समस्या नहीं दिखाई दे रही है। आपके उत्तर – yapkm01

+7

के समान परिणाम मुझे लगता है कि सेटर विधियों के बजाय गेटर का उपयोग करने का एक फायदा यह है कि इससे अपरिवर्तनीय गुण होने की अनुमति मिलती है जिसके लिए उपरोक्त उल्लिखित संपत्ति स्तर (क्षेत्र स्तर के लिए अपवाद) बाधाओं के लाभ प्राप्त करते समय कोई सेटटर मौजूद नहीं है। – Gunnar

+0

@ yapkm01 कृपया मेरे उत्तर पर एक नज़र डालें। सेटर विधि के साथ एक समस्या है। आप सार्वजनिक सेटटर विधि का उपयोग करके हमेशा सही क्षेत्र की भविष्यवाणी नहीं कर सकते हैं। –

5

इस कोड पर विचार करें।

रखें एनोटेशन public String getName()

से अधिक एनोटेशन आसानी से क्षेत्र की पहचान करता है बस देख पर क्षेत्र लौट आए।

रखें एनोटेशन public void setName(String name) से अधिक

एनोटेशन क्षेत्र पहचान नहीं कर सकते, क्योंकि वहाँ एक से अधिक हो सकता है संशोधित क्षेत्र को देखकर।

+3

प्रतिबिंब विधि कार्यान्वयन को नहीं देखता है, यह गेटटर/सेटर का नाम देखता है और एक फ़ील्ड तक मेल खाता है –

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