परिचय: "बस फ़ील्ड को public क्यों नहीं बना देते?"
\n\nएक स्थिति की कल्पना करें: आप Java में एक Person क्लास लिख रहे हैं। इसमें नाम, आयु और ईमेल है। सबसे आसान तरीका है फ़ील्ड को public घोषित करना और सीधे उन तक पहुँचना:
public class Person {\n public String name;\n public int age;\n public String email;\n}\n\n"यह तो काम करता है! — आप कहेंगे। — मुझे इन गेटर्स और सेटर्स की क्या आवश्यकता है? अनावश्यक कोड, लाइनें बढ़ जाती हैं..."
\n\nयह प्रश्न Stack Overflow पर सबसे लोकप्रिय प्रश्नों में से एक है। हजारों डेवलपर, विशेषकर शुरुआती, यह सवाल पूछते हैं। एक अनुभवी Java प्रोग्रामर से आपको जो उत्तर मिलेगा वह छोटा होगा: एनकैप्सुलेशन। लेकिन इस शब्द के पीछे डिज़ाइन का एक पूरा दर्शन छिपा है जो प्रोजेक्ट्स को अराजकता से बचाता है।
\n\nइस लेख में हम केवल परिभाषा नहीं देंगे। हम उन वास्तविक समस्याओं को समझेंगे जिन्हें गेटर्स और सेटर्स (जिन्हें accessors और mutators भी कहा जाता है) हल करते हैं, और इसे लाइव कोड के साथ दिखाएंगे। चलिए शुरू करते हैं!
\n\n1. एनकैप्सुलेशन: सिर्फ एक फैशनेबल शब्द नहीं
\n\nएनकैप्सुलेशन OOP का एक सिद्धांत है जो कहता है: ऑब्जेक्ट की आंतरिक संरचना को छिपाएँ और उसके साथ बातचीत के लिए एक नियंत्रित इंटरफ़ेस प्रदान करें। गेटर्स और सेटर्स वही नियंत्रित इंटरफ़ेस हैं।
\n\nदो दृष्टिकोणों की तुलना करें:
\n\nखराब दृष्टिकोण (public फ़ील्ड)
\nPerson person = new Person();\nperson.age = -5; // नकारात्मक आयु? आसानी से!\nperson.email = "not-an-email"; // बिना जाँच के कचरा डेटा पास हो जाता है\n\nअच्छा दृष्टिकोण (गेटर्स और सेटर्स)
\npublic class Person {\n private String name;\n private int age;\n private String email;\n\n public int getAge() {\n return age;\n }\n\n public void setAge(int age) {\n if (age < 0 || age > 150) {\n throw new IllegalArgumentException("आयु 0 से 150 के बीच होनी चाहिए");\n }\n this.age = age;\n }\n\n public String getEmail() {\n return email;\n }\n\n public void setEmail(String email) {\n if (email == null || !email.contains("@")) {\n throw new IllegalArgumentException("अमान्य ईमेल");\n }\n this.email = email;\n }\n\n // बाकी गेटर्स/सेटर्स...\n}\n\nअब, यदि कोई आयु -5 सेट करने का प्रयास करता है, तो प्रोग्राम एक अपवाद फेंक देगा। डेटा सुरक्षित है। यही है एनकैप्सुलेशन की शक्ति।
\n\n2. डेटा की तुरंत वैधता जाँच (वैलिडेशन)
\n\nसेटर्स इनपुट डेटा की जाँच के लिए आदर्श स्थान हैं। इनके बिना, आपको हर उस स्थान पर वैलिडेशन लिखना होगा जहाँ आप मान निर्दिष्ट करते हैं। और यह कोड की नकल और कहीं जाँच करना भूल जाने का जोखिम है।
\n\nबैंक खाते का उदाहरण:
\n\npublic class BankAccount {\n private double balance;\n\n public double getBalance() {\n return balance;\n }\n\n public void deposit(double amount) {\n if (amount <= 0) {\n throw new IllegalArgumentException("जमा राशि सकारात्मक होनी चाहिए");\n }\n this.balance += amount;\n }\n\n public void withdraw(double amount) {\n if (amount <= 0) {\n throw new IllegalArgumentException("निकासी राशि सकारात्मक होनी चाहिए");\n }\n if (amount > balance) {\n throw new IllegalStateException("अपर्याप्त धनराशि");\n }\n this.balance -= amount;\n }\n}\n\nध्यान दें: यहाँ balance के लिए सीधा कोई सेटर नहीं है। हम deposit और withdraw विधियों के माध्यम से बैलेंस का प्रबंधन करते हैं, जिनमें पहले से ही सभी जाँच तर्क शामिल हैं। गेटर बस वर्तमान स्थिति लौटाता है।
3. लचीलापन: आप कोड को तोड़े बिना कार्यान्वयन बदल सकते हैं
\n\nकल्पना करें कि आप आयु को int फ़ील्ड में संग्रहीत कर रहे हैं, और फिर आप जन्म तिथि संग्रहीत करने और आयु की गतिशील गणना करने का निर्णय लेते हैं। यदि आपके पास
ब्लॉग
पुस्तक अनुशंसाएँ
यह भी पढ़ें
std::endl बनाम `\\n`: क्या तेज़ है और यह क्यों महत्वपूर्ण है?
iOS/macOS के लिए Swift में रेगुलर एक्सप्रेशन: व्यावहारिक उदाहरण
शुरुआती JavaScript डेवलपर्स की शीर्ष गलतियाँ: उनसे कैसे बचें
Kotlin के साथ मोनोरिपॉजिटरी: शुरुआती लोगों के लिए कोड संगठन
बैकएंड के लिए TypeScript बनाम Python: 2024 में क्या चुनें