Java Language
encapsulation
खोज…
परिचय
कल्पना कीजिए कि आपके पास कुछ बहुत महत्वपूर्ण चर के साथ एक वर्ग था और उन्हें अस्वीकार्य मूल्यों के लिए (उनके कोड से अन्य प्रोग्रामर द्वारा) सेट किया गया था। उनका कोड आपके कोड में त्रुटियां लाया। समाधान के रूप में, OOP में, आप किसी ऑब्जेक्ट की स्थिति (इसके चर में संग्रहीत) को केवल विधियों के माध्यम से संशोधित करने की अनुमति देते हैं। किसी ऑब्जेक्ट की स्थिति को छिपाना और ऑब्जेक्ट्स विधियों के माध्यम से सभी इंटरैक्शन प्रदान करना डेटा एनकैप्सुलेशन के रूप में जाना जाता है।
टिप्पणियों
एक चर private
को चिह्नित करने के साथ शुरू करना बहुत आसान है और यदि पहले से ही public
चर को छिपाने के लिए आवश्यक है तो इसे उजागर करें।
एक अपवाद है जहां एनकैप्सुलेशन फायदेमंद नहीं हो सकता है: "डंब" डेटा संरचनाएं (कक्षाएं जिनका एकमात्र उद्देश्य चर पकड़ना है)।
public class DumbData {
public String name;
public int timeStamp;
public int value;
}
इस मामले में, कक्षा का इंटरफ़ेस वह डेटा है जो इसे धारण करता है।
ध्यान दें कि final
चिह्नित वैरिएबल को बिना इनकैप्सुलेशन के उल्लंघन के public
रूप से चिह्नित किया जा सकता है क्योंकि उन्हें सेट किए जाने के बाद बदला नहीं जा सकता है।
आक्रमणकारियों को बनाए रखने के लिए इनकैप्सुलेशन
एक वर्ग के दो भाग हैं: इंटरफ़ेस और कार्यान्वयन।
इंटरफ़ेस वर्ग की उजागर कार्यक्षमता है। इसके सार्वजनिक तरीके और चर इंटरफ़ेस का हिस्सा हैं।
कार्यान्वयन एक वर्ग के आंतरिक कामकाज है। अन्य वर्गों को एक वर्ग के कार्यान्वयन के बारे में जानना चाहिए।
एनकैप्सुलेशन से तात्पर्य उस वर्ग के किसी भी उपयोगकर्ता से किसी वर्ग के कार्यान्वयन को छिपाने की प्रथा से है। यह वर्ग को अपनी आंतरिक स्थिति के बारे में धारणा बनाने की अनुमति देता है।
उदाहरण के लिए, एक कोण का प्रतिनिधित्व करने वाला यह वर्ग लें:
public class Angle {
private double angleInDegrees;
private double angleInRadians;
public static Angle angleFromDegrees(double degrees){
Angle a = new Angle();
a.angleInDegrees = degrees;
a.angleInRadians = Math.PI*degrees/180;
return a;
}
public static Angle angleFromRadians(double radians){
Angle a = new Angle();
a.angleInRadians = radians;
a.angleInDegrees = radians*180/Math.PI;
return a;
}
public double getDegrees(){
return angleInDegrees;
}
public double getRadians(){
return angleInRadians;
}
public void setDegrees(double degrees){
this.angleInDegrees = degrees;
this.angleInRadians = Math.PI*degrees/180;
}
public void setRadians(double radians){
this.angleInRadians = radians;
this.angleInDegrees = radians*180/Math.PI;
}
private Angle(){}
}
यह वर्ग एक बुनियादी धारणा (या अपरिवर्तनीय ) पर निर्भर करता है: कोणइंजडे और कोणइरादियन हमेशा सिंक में होते हैं । यदि वर्ग के सदस्य सार्वजनिक थे, तो इस बात की कोई गारंटी नहीं होगी कि कोणों के दो प्रतिनिधित्व सहसंबद्ध हैं।
युग्मन को कम करने के लिए एनकैप्सुलेशन
एनकैप्सुलेशन आपको किसी भी कोड को प्रभावित किए बिना कक्षा में आंतरिक परिवर्तन करने की अनुमति देता है जो कक्षा को बुलाता है। यह युग्मन को कम करता है, या किसी भी वर्ग को किसी अन्य वर्ग के कार्यान्वयन पर निर्भर करता है।
उदाहरण के लिए, चलो पिछले उदाहरण से कोण वर्ग के कार्यान्वयन को बदलते हैं:
public class Angle {
private double angleInDegrees;
public static Angle angleFromDegrees(double degrees){
Angle a = new Angle();
a.angleInDegrees = degrees;
return a;
}
public static Angle angleFromRadians(double radians){
Angle a = new Angle();
a.angleInDegrees = radians*180/Math.PI;
return a;
}
public double getDegrees(){
return angleInDegrees;
}
public double getRadians(){
return angleInDegrees*Math.PI / 180;
}
public void setDegrees(double degrees){
this.angleInDegrees = degrees;
}
public void setRadians(double radians){
this.angleInDegrees = radians*180/Math.PI;
}
private Angle(){}
}
इस वर्ग का कार्यान्वयन बदल गया है ताकि यह केवल कोण के एक प्रतिनिधित्व को संग्रहीत करता है और जरूरत पड़ने पर दूसरे कोण की गणना करता है।
हालाँकि, कार्यान्वयन बदल गया, लेकिन इंटरफ़ेस नहीं आया । यदि एक कॉलिंग क्लास को एंगरियर्स विधि तक पहुंचने पर निर्भर करता है, तो इसे Angle
के नए संस्करण का उपयोग करने के लिए बदलना होगा। कॉलिंग क्लासेस को किसी क्लास के आंतरिक प्रतिनिधित्व की परवाह नहीं करनी चाहिए।