2009-07-07 11 views
19

मैं अपना डीटल, जावा प्रोग्राम प्रोग्राम कैसे पढ़ रहा हूं और शब्द पर आया हूं। यदि छाया की अनुमति है, तो जावा क्लास में इसके लिए क्या स्थिति या उद्देश्य क्या है?जावा क्लास में उपयोग किए जाने वाले वेरिएबल शेडिंग क्या है?

उदाहरण:

public class Foo { 

    int x = 5; 

    public void useField() { 
     System.out.println(this.x); 
    } 
    public void useLocal() { 
     int x = 10; 
     System.out.println(x); 
    } 
} 

उत्तर

32

शेडिंग का मूल उद्देश्य आस-पास के वर्ग से स्थानीय कोड को कम करना है। यदि यह उपलब्ध नहीं था, तो निम्नलिखित मामले पर विचार करें।

एपीआई में एक कक्षा फू जारी किया गया है। आपके कोड में आप इसे उप-वर्गीकृत करते हैं, और आपके उप-वर्ग में एक चर नामक चर का उपयोग करते हैं। फिर फू एक अद्यतन जारी करता है और बार को अपनी कक्षा में एक संरक्षित वैरिएबल जोड़ता है।

अब आपकी कक्षा किसी ऐसे संघर्ष के कारण नहीं चलेगी जिसकी आप उम्मीद नहीं कर सकते थे।

हालांकि, उद्देश्य पर ऐसा न करें। केवल यह तब होता है जब आप वास्तव में इस बात की परवाह नहीं करते कि दायरे के बाहर क्या हो रहा है।

+7

मुझे आपका अंतिम बिंदु पसंद है "केवल यह तब होता है जब आप वास्तव में इस बात की परवाह नहीं करते कि दायरे के बाहर क्या हो रहा है।" ... आपको पता चलेगा कि देखभाल कब शुरू होनी चाहिए जब आपके आवृत्ति परिवर्तनीय मूल्य के साथ कुछ अजीब शुरू हो रहा है :))) वैसे भी, यह हमेशा एक अच्छा अभ्यास है जो आपके तरीकों के अंदर इस .variable_name का उपयोग करता है जो एक उदाहरण के मान को सेट कर रहा है चर ... – luigi7up

8

एक प्रमुख उद्देश्य लोगों को भ्रमित करने के लिए है। यह बुरा अभ्यास है और इससे बचा जाना चाहिए।

+0

विवादास्पद मैं ;-) –

+6

मान आप आगे की व्याख्या कर सकते कैसे this.x = एक्स बिल्कुल भ्रामक है? – RichieHH

13

यह setters जहां सिर्फ विधि पैरामीटर जैसे के लिए एक अलग चर नाम बनाने के लिए नहीं करना चाहते हैं के लिए उपयोगी हो सकता है:

public void setX(int x) { 
    this.x = x; 
} 

अलावा कि मैं उनसे बचने चाहते हैं।

+1

छाया चर के लिए यह एक भयानक कारण है। छायांकन हमेशा आपको संभावित त्रुटियों तक खुलता है, और "यह" शामिल करने के बजाय, स्कोप जानकारी के साथ वैरिएबल नामों के साथ-साथ पैरामीटर का नाम बदलने के लिए आसान है। हर बार। – Rick

+3

एक साधारण सेटर के लिए, ऊपर दिए गए उदाहरण में मुझे लगता है कि यह ठीक है, पैरामीटर का नाम बदलकर चीजें बदसूरत हो जाएंगी। इससे कहीं अधिक जटिल, मैं सहमत हूं, पूरी तरह से बचें। –

4

छाया वास्तव में एक जावा शब्द नहीं है। किसी भी उदाहरण में जहां एक दायरे में घोषित एक वैरिएबल का एक ही नाम एक बड़े दायरे में होता है, वह चर छायांकित होता है।

छायांकन के लिए कुछ सामान्य उपयोग तब होते हैं जब आपके भीतर आंतरिक और बाहरी वर्ग होते हैं और एक ही नाम के साथ एक चर को बनाए रखना चाहते हैं।

यदि आप इससे बच सकते हैं, तो आपको भ्रम पैदा हो सकता है।

1

दो आम उपयोग निर्माणकर्ता और सेट तरीके हैं:

public Foo(int x) { 
    this.x = x; 
} 

public void setX(int x) { 
    this.x = x; 
} 

बहुत कभी कभी यह उपयोगी है यदि आप एक ही पल में चर की एक प्रति चाहते हैं, लेकिन चर विधि कॉल के भीतर बदल सकते हैं।

private void fire() { 
    Listener[] listeners = this.listeners; 
    int num = listeners.length; 
    for (int ct=0; ct<num; ++ct) { 
     listeners[ct].stateChanged(); 
    } 
} 

(बेशक, एक काल्पनिक उदाहरण अनावश्यक पाश के लिए आलीशान के साथ बनाया।)

+0

इन मामलों में से किसी एक के लिए छाया करना आवश्यक नहीं है। – Rick

+1

@ रिक कोई भी आवश्यक होने के बारे में बात नहीं कर रहा था। छायांकन आवश्यक नहीं है। –

+0

मैं कह रहा हूं, किसी को कभी छाया नहीं करना चाहिए। बस चर अलग-अलग नाम दें। – Rick

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

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