वे वैश्विक चर के समान तरीके से पुन: प्रयोज्यता को कम करते हैं: जब आप विधि की गणना विधि पर बाहरी स्थिति पर निर्भर करते हैं, लेकिन पैरामीटर (यानी उदाहरण के लिए कक्षा फ़ील्ड) के रूप में पारित नहीं होते हैं, तो आपकी विधि कम पुन: प्रयोज्य होती है, क्योंकि यह उस वस्तु/वर्ग की स्थिति के साथ कसकर जोड़ता है जिसमें यह रहता है (या बदतर, पूरी तरह से एक अलग वर्ग पर)।
संपादित करें: ठीक है, इसे और अधिक स्पष्ट करने के लिए यहां एक उदाहरण दिया गया है। मैंने सिर्फ प्रश्न के लिए ThreadLocal
का उपयोग किया है, लेकिन यह सामान्य रूप से वैश्विक चर पर लागू होता है। मान लें कि मैं कई धागे पर समानांतर में पहले एन पूर्णांक के योग की गणना करना चाहता हूं। हम जानते हैं कि ऐसा करने का सबसे अच्छा तरीका प्रत्येक थ्रेड के लिए स्थानीय रकम की गणना करना है और उन्हें अंत में जोड़ना है। किसी कारण से हम तय करते हैं कि प्रत्येक Task
की call
विधि एक ThreadLocal sum
चर जो एक वैश्विक (स्थिर) चर के रूप में एक अलग वर्ग में परिभाषित किया गया है का उपयोग करेगा:
class Foo {
public static ThreadLocal<Long> localSum = new ThreadLocal<Long>() {
public Long initialValue() {
return new Long(0);
}
};
}
class Task implements Callable<Long> {
private int start = 0;
private int end = 0;
public Task(int start, int end) {
this.start = start;
this.end = end;
}
public Long call() {
for(int i = start; i < end; i++) {
Foo.localSum.set(Foo.localSum.get() + i);
}
return Foo.localSum.get();
}
}
कोड सही ढंग से काम करता है और हम में से उम्मीद मूल्य देता है वैश्विक योग, लेकिन हम उस वर्ग Task
और उसके call
विधि अब सख्ती से Foo
वर्ग के लिए युग्मित कर रहे हैं पर ध्यान दें। अगर मैं किसी अन्य प्रोजेक्ट में Task
कक्षा का पुन: उपयोग करना चाहता हूं, तो मुझे Foo
कक्षा को भी स्थानांतरित करना होगा अन्यथा कोड संकलित नहीं होगा।
हालांकि यह एक सरल उदाहरण उद्देश्य पर जटिल है, तो आप "छिपा" वैश्विक चर के खतरों देख सकते हैं। यह भी पठनीयता को प्रभावित करता है के बाद से किसी और पढ़ने कोड भी वर्ग Foo
के लिए खोज और देखो क्या Foo.localSum
की परिभाषा है करना होगा। आपको अपनी कक्षाओं को यथासंभव स्वयं निहित रखना चाहिए।
मैं एक सरल कोड उदाहरण के साथ अपने जवाब देने के लिए एक संपादन किया है। – Tudor