Accessors और modifiers (उर्फ सेटर और गेटर्स) तीन मुख्य कारणों के लिए उपयोगी हैं:
- वे चर तक पहुंच को प्रतिबंधित करते हैं।
- उदाहरण के लिए, एक चर को एक्सेस किया जा सकता है, लेकिन संशोधित नहीं।
- वे मापदंडों को मान्य करते हैं।
- वे कुछ दुष्प्रभाव पैदा कर सकते हैं।
वेब पर विश्वविद्यालयों, ऑनलाइन पाठ्यक्रम, ट्यूटोरियल, ब्लॉग लेख और कोड उदाहरण सभी एक्सेसरों और संशोधक के महत्व के बारे में जोर दे रहे हैं, वे आजकल कोड के लिए "होना चाहिए" जैसा महसूस करते हैं। तो कोई उन्हें तब भी ढूंढ सकता है जब वे नीचे दिए गए कोड की तरह कोई अतिरिक्त मूल्य प्रदान नहीं करते हैं।
public class Cat {
private int age;
public int getAge() {
return this.age;
}
public void setAge(int age) {
this.age = age;
}
}
यह कहा गया है, यह अधिक उपयोगी संशोधक खोजने के लिए बहुत आम है, जो वास्तव में मापदंडों को मान्य करते हैं और एक अपवाद फेंकते हैं या एक बूलियन वापस करते हैं यदि अवैध इनपुट की आपूर्ति की गई है, तो कुछ इस तरह:
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
लेकिन फिर भी, मैं लगभग कभी नहीं देखता कि एक निर्माणकर्ता से संशोधक को बुलाया गया था, इसलिए मैं जिस साधारण वर्ग का सामना करता हूं उसका सबसे आम उदाहरण इस प्रकार है:
public class Cat {
private int age;
public Cat(int age) {
this.age = age;
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
लेकिन कोई यह सोचेगा कि यह दूसरा तरीका बहुत सुरक्षित है:
public class Cat {
private int age;
public Cat(int age) {
//Use the modifier instead of assigning the value directly.
setAge(age);
}
public int getAge() {
return this.age;
}
/**
* Sets the age for the current cat
* @param age an integer with the valid values between 0 and 25
* @return true if value has been assigned and false if the parameter is invalid
*/
public boolean setAge(int age) {
//Validate your parameters, valid age for a cat is between 0 and 25 years
if(age > 0 && age < 25) {
this.age = age;
return true;
}
return false;
}
}
क्या आप अपने अनुभव में एक समान पैटर्न देखते हैं या यह सिर्फ मेरे लिए अशुभ है? और अगर आप करते हैं, तो आपको क्या लगता है कि क्या कारण है? क्या कंस्ट्रक्टरों से संशोधक का उपयोग करने के लिए एक स्पष्ट नुकसान है या क्या उन्हें सिर्फ सुरक्षित माना जाता है? यह कुछ और है?