आप कुछ भी याद नहीं कर रहे हैं। आप जो करते हैं वह पूरी तरह से आपकी स्थिति पर निर्भर करता है। हालांकि, इस पर विचार करें:
एक सेटर में पैरामीटर सत्यापन करना बहुत आम है।उदाहरण के लिए, मान लीजिए कि मैं क्षेत्र के साथ एक वर्ग है कि 10 के माध्यम से एक मान 0 पकड़ कर सकते हैं करते हैं ("फेंकता है" अपवाद के लिए नीचे दिए गए टाइप अनावश्यक है, लेकिन मैं स्पष्टता के लिए इसे शामिल):
public class Example {
private int value;
public Example() {
}
public final int getValue() {
return value;
}
public final void setValue (int value) throws IllegalArgumentException {
if (value < 0 || value > 10)
throw new IllegalArgumentException("Value is out of range.");
}
}
यहाँ, setValue () यह सुनिश्चित करने के लिए 'मान' को मान्य करता है कि यह नियमों पर चिपक जाता है। हमारे पास एक आविष्कार है जो कहता है "एक उदाहरण सीमा मूल्य से बाहर नहीं होगा"। अब मान लें कि हम एक कन्स्ट्रक्टर बनाना चाहते हैं जो एक मूल्य लेता है। आप यह कर सकते हैं:
public class Example {
...
public Example (int value) {
this.value = value;
}
...
}
जैसा कि आप देख सकते हैं, एक समस्या है। बयान नया उदाहरण (11) सफल होगा, और अब एक उदाहरण मौजूद है जो हमारे नियमों को तोड़ देता है। हालांकि, अगर हम निर्माता में सेटर उपयोग करें, हम आसानी से सभी पैरामीटर सत्यापन निर्माता के रूप में अच्छी तरह जोड़ सकते हैं:
public class Example {
...
public Example (int value) throws IllegalArgumentException {
setValue(value); // throws if out of range
}
...
}
तो वहाँ यह करने के लिए कई लाभ हैं।
अब, अभी भी ऐसे मामले हैं जब आप सीधे मूल्यों को असाइन करना चाहते हैं। एक के लिए, हो सकता है कि आपके पास सेटटर उपलब्ध न हों (हालांकि मैं तर्क दूंगा कि निजी या पैकेज निजी सेटर्स बनाना अभी भी वांछनीय है, ऊपर उल्लिखित कारणों के लिए, यदि आवश्यक हो तो प्रतिबिंब/बीन समर्थन के लिए, और अधिक जटिल कोड में सत्यापन की आसानी के लिए)।
एक और कारण यह हो सकता है कि शायद आपके पास एक ऐसा निर्माता हो जो जानता है कि किसी भी तरह से, वैध मानों को आवंटित किए जाने के समय से पहले, और इसलिए सत्यापन की आवश्यकता नहीं है और वे चर को सीधे असाइन कर सकते हैं। यह आमतौर पर सेटर्स का उपयोग करके छोड़ने के लिए एक अनिवार्य कारण नहीं है।
हालांकि, सभी में, आमतौर पर हर जगह सेटर्स का उपयोग करना एक अच्छा विचार है, यह आम तौर पर क्लीनर और स्पष्ट कोड का कारण बनता है जो जटिलता बढ़ने के साथ बनाए रखना आसान होता है।
उदाहरण के अधिकांश उदाहरण जहां लोग सीधे चर सेट करते हैं, वे लोग "आलसी" होते हैं - जो स्थिति पूरी तरह से स्वीकार्य है (शायद आप एक त्वरित परीक्षण कार्यक्रम या आवेदन लिख रहे हैं और नहीं चाहते हैं उदाहरण के लिए, सेटर्स का एक समूह लागू करें)। जब तक आप बड़ी तस्वीर को ध्यान में रखते हैं तब तक कुछ भी गलत नहीं होता है और जब उचित हो तो केवल "आलसी" हो।
कुछ मैं यहां कुछ अन्य उत्तरों के आधार पर जोड़ना चाहता हूं: यदि आप उप-वर्ग में एक सेटर को ओवरराइड करते हैं, और जिस डेटा को आप सेट कर रहे हैं, वह बेस क्लास मानता है, तो या तो प्रासंगिक सेटर्स होना चाहिए अंतिम या बेस क्लास को उन धारणाओं को नहीं बनाना चाहिए। यदि ओवरराइडिंग सेटर्स बेस क्लास इनवेरिएंट तोड़ते हैं तो हाथ में एक बड़ा मुद्दा होता है।
आप देखेंगे कि गेटटर/सेटर उपर्युक्त उदाहरण में अंतिम है। ऐसा इसलिए है क्योंकि हमारा नियम यह है कि "किसी भी उदाहरण के पास 0 से 10 का मान होना चाहिए"। इसलिए यह नियम उप-वर्गों तक फैलता है। अगर हमारे पास वह नियम नहीं था और यदि कोई उदाहरण किसी भी मूल्य पर ले सकता है, तो हमें अंतिम सेटटर की आवश्यकता नहीं होगी और उप-वर्गों को ओवरराइड करने की अनुमति दे सकती है।
उम्मीद है कि मदद करता है।
मेरा मानना है कि चर बनाने के उद्देश्य से उन्हें ** अन्य ** कक्षाओं से प्रत्यक्ष हेरफेर से अलग करना है। –
इसके अतिरिक्त, 'यह' कीवर्ड गेटर के लिए आवश्यक नहीं है; इसका उपयोग तब किया जाता है जब अस्पष्टता होती है (यानी यदि एक ही स्कोप में "नाम" नामक एक और चर होता है) – ataulm