Java Language
गेटर्स एंड सेटर्स
खोज…
परिचय
गेटर्स और सेटर्स जोड़ना
OOP में एनकैप्सुलेशन एक मूल अवधारणा है। यह एकल इकाई के रूप में डेटा और कोड को लपेटने के बारे में है। इस मामले में, चर को private
घोषित private
और फिर Getters
और Setters
माध्यम से उन्हें देखने और / या संशोधित करने के लिए उन्हें एक्सेस करना एक अच्छा अभ्यास है।
public class Sample {
private String name;
private int age;
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
इन निजी चर को कक्षा के बाहर से सीधे एक्सेस नहीं किया जा सकता है। इसलिए वे अनधिकृत पहुंच से सुरक्षित हैं। लेकिन अगर आप उन्हें देखना या संशोधित करना चाहते हैं, तो आप गेटर्स और सेटर्स का उपयोग कर सकते हैं।
getXxx()
विधि चर xxx
का वर्तमान मान getXxx()
, जबकि आप setXxx()
का उपयोग करके चर xxx
का मान सेट कर सकते हैं।
विधियों का नामकरण सम्मेलन है (उदाहरण में परिवर्तनशील चर कहा जाता variableName
):
सभी गैर
boolean
चरgetVariableName() //Getter, The variable name should start with uppercase setVariableName(..) //Setter, The variable name should start with uppercase
boolean
चरisVariableName() //Getter, The variable name should start with uppercase setVariableName(...) //Setter, The variable name should start with uppercase
सार्वजनिक गेटर्स और सेटर्स एक जावा बीन की संपत्ति परिभाषा का हिस्सा हैं।
एक बाधा को लागू करने के लिए एक सेटर या गेट्टर का उपयोग करना
सेटर्स और गेटर्स एक ऑब्जेक्ट के लिए निजी चरों को शामिल करने की अनुमति देते हैं जिन्हें एक्सेस और प्रतिबंधों के साथ बदला जा सकता है। उदाहरण के लिए,
public class Person {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
if(name!=null && name.length()>2)
this.name = name;
}
}
इस Person
वर्ग में, एक एकल चर है: name
। इस वैरिएबल को getName()
विधि का उपयोग करके एक्सेस किया जा सकता है और setName(String)
विधि का उपयोग करके बदला जा सकता है, हालांकि, नाम सेट करने के लिए नए नाम की आवश्यकता होती है, जिसकी लंबाई 2 वर्णों से अधिक हो और अशक्त न हो। चर name
सार्वजनिक करने के बजाय एक सेटर विधि का उपयोग करना दूसरों को कुछ प्रतिबंधों के साथ name
के मूल्य को निर्धारित करने की अनुमति देता है। उसी को गेट्टर विधि पर लागू किया जा सकता है:
public String getName(){
if(name.length()>16)
return "Name is too large!";
else
return name;
}
ऊपर संशोधित getName()
विधि में, name
केवल तभी लौटाया जाता है जब उसकी लंबाई 16 से कम या उसके बराबर हो। अन्यथा, "Name is too large"
लौटाया जाता है। यह प्रोग्रामर को वैरिएबल बनाने की अनुमति देता है जो पहुंच योग्य और परिवर्तनीय हैं, लेकिन वे चाहते हैं कि क्लाइंट क्लासेस को वैरिएबल को एडिट करने से रोका जा सके।
गेटर्स और सेटर्स का उपयोग क्यों करें?
एक मूल वर्ग पर विचार करें जिसमें जावा में गेटर्स और सेटर्स के साथ एक ऑब्जेक्ट है:
public class CountHolder {
private int count = 0;
public int getCount() { return count; }
public void setCount(int c) { count = c; }
}
हम count
चर तक पहुँच नहीं सकते क्योंकि यह निजी है। लेकिन हम getCount()
और setCount(int)
विधियों तक पहुँच सकते हैं क्योंकि वे सार्वजनिक हैं। कुछ के लिए, यह सवाल उठा सकता है; बिचौलिए का परिचय क्यों? क्यों नहीं बस उन्हें सार्वजनिक रूप से गिनना चाहिए?
public class CountHolder {
public int count = 0;
}
सभी इरादों और उद्देश्यों के लिए, ये दोनों बिल्कुल समान हैं, कार्यक्षमता-वार। उनके बीच का अंतर ही एक्स्टेंसिबिलिटी है। विचार करें कि प्रत्येक वर्ग क्या कहता है:
- पहला : "मेरे पास एक ऐसा तरीका है जो आपको एक
int
वैल्यू देगा, और एक ऐसा तरीका जो उस वैल्यू को दूसरेint
सेट करेगा"। - दूसरा : "मेरे पास एक ऐसा
int
जिसे आप सेट कर सकते हैं और जैसा चाहें वैसा कर सकते हैं।"
ये समान लग सकते हैं, लेकिन पहले वास्तव में इसकी प्रकृति में बहुत अधिक संरक्षित है; यह केवल आपको इसकी आंतरिक प्रकृति के साथ बातचीत करने देता है क्योंकि यह तय करता है। यह गेंद को उसके दरबार में छोड़ देता है; यह चुनने के लिए कि आंतरिक बातचीत कैसे होती है। दूसरे ने अपने आंतरिक कार्यान्वयन को बाहरी रूप से उजागर किया है, और अब न केवल बाहरी उपयोगकर्ताओं के लिए प्रवण है, बल्कि, एक एपीआई के मामले में, उस कार्यान्वयन को बनाए रखने के लिए प्रतिबद्ध है (या अन्यथा एक गैर-पिछड़े-संगत एपीआई जारी करना)।
यदि हम गणना को संशोधित और एक्सेस करने के लिए एक्सेस को सिंक्रनाइज़ करना चाहते हैं तो विचार करें। पहले में, यह सरल है:
public class CountHolder {
private int count = 0;
public synchronized int getCount() { return count; }
public synchronized void setCount(int c) { count = c; }
}
लेकिन दूसरे उदाहरण में, यह प्रत्येक स्थान से गुजरने और संशोधित करने के बिना लगभग असंभव है जहां count
चर संदर्भित किया जाता है। इससे भी बदतर, अगर यह एक ऐसा आइटम है जिसे आप लाइब्रेरी में दूसरों द्वारा खपत किए जाने के लिए प्रदान कर रहे हैं, तो आपके पास उस संशोधन को करने का एक तरीका नहीं है, और ऊपर बताए गए कठिन विकल्प बनाने के लिए मजबूर किया जाता है।
तो यह सवाल भी है; सार्वजनिक चर कभी भी एक अच्छी चीज है (या कम से कम, बुराई नहीं)?
मैं अनिश्चित हूँ। (: IE एक ओर, आप सार्वजनिक चर कि समय की कसौटी पर खड़ा है के उदाहरण देख सकते out
चर में संदर्भित System.out
)। दूसरे पर, सार्वजनिक चर प्रदान करने से अत्यधिक न्यूनतम ओवरहेड के बाहर कोई लाभ नहीं मिलता है और शब्दशीलता में संभावित कमी आती है। यहाँ मेरा दिशानिर्देश यह होगा कि, यदि आप एक चर को सार्वजनिक करने की योजना बना रहे हैं, तो आपको इन मानदंडों के विरुद्ध अत्यधिक पूर्वाग्रह के साथ न्याय करना चाहिए:
- चर को इसके कार्यान्वयन में कभी भी परिवर्तन का कोई बोधगम्य कारण नहीं होना चाहिए। यह कुछ ऐसा है जो बहुत आसान है (और, भले ही आप इसे सही तरीके से प्राप्त करें, आवश्यकताओं को बदल सकते हैं), यही वजह है कि गेटर्स / सेटर आम दृष्टिकोण हैं। यदि आप एक सार्वजनिक चर रखने जा रहे हैं, तो यह वास्तव में के माध्यम से सोचने की जरूरत है, खासकर अगर एक पुस्तकालय / रूपरेखा / एपीआई में जारी किया गया है।
- परिवर्तनीय को अक्सर पर्याप्त रूप से संदर्भित करने की आवश्यकता होती है जो कि कम से कम क्रियात्मकता को कम कर देता है। मुझे यह भी नहीं लगता कि एक विधि बनाम सीधे संदर्भित का उपयोग करने के लिए ओवरहेड को यहां माना जाना चाहिए। यह अभी तक बहुत ही नगण्य है कि मैं क्या रूढ़िवादी रूप से अनुमान लगाता हूं कि 99.9% अनुप्रयोग हैं।
वहाँ शायद अधिक से अधिक मैं अपने सिर के ऊपर से विचार नहीं किया है। यदि आप कभी संदेह में हों, तो हमेशा गेटर्स / सेटर का उपयोग करें।