2009-03-10 18 views
18

यदि आपके पास कुछ सादे गेट/सेट गुणों वाला वर्ग है, तो क्लास विधियों के भीतर गेटर्स का उपयोग करने का कोई कारण है, या आप केवल निजी सदस्य चर का उपयोग करना चाहिए? मुझे लगता है कि सेटर्स (सत्यापन तर्क?) पर अधिक तर्क हो सकता है, लेकिन मैं केवल गेटर्स के बारे में सोच रहा हूं।क्लास विधियों के भीतर गेटर्स का उपयोग

(जावा में) उदाहरण के लिए - वहाँ का उपयोग करें विकल्प 2 ?:

public class Something 
{ 
    private int messageId; 
    public int getMessageId() { return this.messageId; } 
    public void setMessage(int messageId) { this.messageId = messageId; } 

    public void doSomething() 
    { 
     // Option 1: 
     doSomethingWithMessageId(messageId); 

     // Option 2: 
     doSomethingWithMessageId(getMessageId()); 
    } 
} 
+0

संभावित डुप्लिकेट [कब कक्षाएं अपने स्वयं के गेटर्स/सेटर्स का उपयोग सदस्यों को सीधे एक्सेस करने के लिए करनी चाहिए?] (Http://stackoverflow.com/questions/586087/when-should-a-class-use-its-own -getters-setters-vs-accessing-the-members-directl) – nawfal

उत्तर

9

सामान्य रूप से जावा प्रोग्रामर गेटर विधियों का उपयोग करने के बारे में बहुत संगत होते हैं। मैं कई भाषाओं प्रोग्राम और मुझे लगता है कि इसके बारे में लगातार नहीं कर रहा हूँ;)

मैं जब तक आप एक गेटर यह कच्चे चर का उपयोग करने के लिए ठीक है नहीं कर कहेंगे - निजी चर के लिए। जब आप गेटटर बनाते हैं, तो आपको केवल इसका उपयोग करना चाहिए। जब मैं एक निजी क्षेत्र के लिए गेटटर बनाता हूं, तो मेरा आईडीई सुझाव देता है कि जब मैं गेटटर पेश करता हूं तो कच्चे क्षेत्र को मेरे लिए स्वचालित रूप से एक्सेस करता है। गेटटर का उपयोग करने के लिए स्विचिंग केवल कुछ कीस्ट्रोक दूर है (और त्रुटियों को पेश करने के किसी भी मौके के बिना), इसलिए मुझे इसे तब तक देरी होती है जब तक मुझे इसकी आवश्यकता न हो।

बेशक, अगर आप गेटटर इंजेक्शन की तरह सामान बनाना चाहते हैं, तो कुछ प्रकार के प्रॉक्सीइंग और हाइबरनेट जैसे फ्रेमवर्क्स जैसे सबक्सासिंग, आपको उपयोगकर्ता गेटर्स करना होगा!

+1

आपका आईडीई कौन सा है? –

+0

गेटर्स का उपयोग करते समय जेआरई प्रदर्शन में कोई अंतर है? – Khozzy

7

ही टिककर खेल के साथ आप गलती से, :) इसके अलावा चर को संशोधित नहीं होते अगर तुम दोनों getters और "कच्चे" का उपयोग किसी भी कारण है परिवर्तनीय, आपका कोड भ्रमित हो सकता है।

इसके अलावा, यदि आप विरासत का उपयोग करते हैं और बाल कक्षाओं में गेटर विधियों को फिर से परिभाषित करते हैं, तो गेटर-उपयोग विधियां ठीक से काम करती हैं, जबकि कच्चे चर का उपयोग करने वाले लोग नहीं करेंगे।

3

यदि आप हर जगह गेटर विधि का उपयोग करते हैं - और भविष्य में getMessageId() के सभी कॉल पर कोड-सर्च करें, तो आप उन्हें सभी पाएंगे, जबकि यदि आप निजी इस्तेमाल करते थे, तो आप कुछ याद कर सकते हैं।

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

1

यदि आप जो संपत्ति संपत्ति को आवंटित कर रहे हैं वह ज्ञात या सत्यापित मान है, तो आप सुरक्षित रूप से निजी चर का उपयोग कर सकते हैं। (शायद कुछ विशेष परिस्थितियों में, जहां यह स्पष्ट होगा कि यह बुरा क्यों होगा।) चाहे आप स्वाद या शैली का विषय हों या नहीं। यह एक प्रदर्शन मुद्दा नहीं है, क्योंकि गेटटर या सेटर को संकलक द्वारा रेखांकित किया जाएगा यदि यह काफी आसान है।

यदि मूल्य कक्षा के लिए अज्ञात है, तो आपको इसे सेट करने के लिए संपत्ति का उपयोग करना चाहिए, ताकि आप संपत्ति को अवैध मूल्यों से बचा सकें।

public class Something { 

    private string _value; 

    public string Value { 
     get { 
     return _value; 
     } 
     set { 
     if (value == null) throw new ArgumentNullException(); 
     _value = value; 
     } 
    } 

    public Something() { 
     // using a known value 
     _value = "undefined"; 
    } 

    public Something(string initValue) { 
     // using an unknown value 
     Value = initValue; 
    } 

} 
0

आप गेटर आप सुनिश्चित कर रहे हैं कि आप किसी भी तर्क के बाद मूल्य मिलेगा का उपयोग करते हैं/निर्णय यह करने के लिए लागू किया गया है:

यहाँ एक उदाहरण (सी # में) है। यह शायद आपकी सामान्य स्थिति नहीं है, लेकिन जब यह है, तो आप इसके लिए धन्यवाद देंगे।

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