CodeGym/Java Blog/अनियमित/जावा में एक्सेस संशोधक
John Squirrels
स्तर 41
San Francisco

जावा में एक्सेस संशोधक

अनियमित ग्रुप में प्रकाशित
सदस्य
नमस्ते! आज के पाठ में, हम एक्सेस संशोधक की अवधारणा से परिचित होंगे और उनके साथ काम करने के उदाहरणों पर विचार करेंगे। बेशक, 'परिचित हों' कहना बिल्कुल सही नहीं है: आप उनमें से अधिकांश के साथ पिछले पाठों से पहले से ही परिचित हैं। ज़रुरत पड़े तो आइए सबसे महत्वपूर्ण बिंदु की अपनी याददाश्त को ताज़ा करें। संशोधक पहुंच अक्सर ऐसे कीवर्ड होते हैं जो आपके कोड के विभिन्न हिस्सों तक पहुंच को नियंत्रित करते हैं। क्यों 'अक्सर'? क्योंकि उनमें से एक डिफ़ॉल्ट रूप से एक कीवर्ड के उपयोग के बिना सेट किया गया है :) जावा में चार एक्सेस संशोधक हैं। हम उन्हें सबसे अधिक प्रतिबंधात्मक से सबसे अधिक 'उदार' के क्रम में सूचीबद्ध करते हैं:
  • निजी;
  • डिफ़ॉल्ट (पैकेज दृश्यमान);
  • संरक्षित;
  • जनता।
आइए उनमें से प्रत्येक पर एक नज़र डालें और पहचानें कि वे कब उपयोगी हो सकते हैं। और हम उदाहरण देंगे :)

निजी संशोधक

पहुँच संशोधक।  निजी, संरक्षित, डिफ़ॉल्ट, सार्वजनिक - 2निजी सबसे प्रतिबंधित पहुंच संशोधक है। यह एक ही वर्ग के भीतर डेटा और विधियों की दृश्यता को सीमित करता है। आप इस संशोधक को गेटर्स और सेटर्स के पाठ से जानते हैं। यह उदाहरण याद है?
public class Cat {

   public String name;
   public int age;
   public int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }
}

public class Main {

   public static void main(String[] args) {

       Cat cat = new Cat();
       cat.name = "";
       cat.age = -1000;
       cat.weight = 0;
   }
}
पिछले पाठ में हमने इस पर विचार किया। हमने यहां एक गंभीर गलती की है: हम अपने डेटा को सार्वजनिक करते हैं, जिससे साथी प्रोग्रामर सीधे फ़ील्ड तक पहुंच सकते हैं और उनके मूल्यों को बदल सकते हैं। और क्या... ये मान बिना किसी जाँच के निर्दिष्ट किए गए थे। इसका मतलब है कि हमारा प्रोग्राम -1000 साल की उम्र और 0 के वजन के साथ "" नाम की एक बिल्ली बना सकता है। इस समस्या को हल करने के लिए, हमने गेटर्स और सेटर्स का इस्तेमाल किया, और डेटा तक पहुंच को सीमित करने के लिए निजी संशोधक का भी इस्तेमाल किया।
public class Cat {

   private String name;
   private int age;
   private int weight;

   public Cat(String name, int age, int weight) {
       this.name = name;
       this.age = age;
       this.weight = weight;
   }

   public Cat() {
   }

   public void sayMeow() {
       System.out.println("Meow!");
   }

   public String getName() {
       return name;
   }

   public void setName(String name) {
       // input parameter check
       this.name = name;
   }

   public int getAge() {
       return age;
   }

   public void setAge(int age) {
       // input parameter check
       this.age = age;
   }

   public int getWeight() {
       return weight;
   }

   public void setWeight(int weight) {
       // input parameter check
       this.weight = weight;
   }
}
मूल रूप से, खेतों तक पहुंच को सीमित करना और गेटर्स और सेटर्स को लागू करना निजी होने का सबसे आम उदाहरण हैवास्तविक कार्य में उपयोग होगा। दूसरे शब्दों में, इस संशोधक का मुख्य उद्देश्य किसी प्रोग्राम में एनकैप्सुलेशन हासिल करना है। यह केवल खेतों पर ही लागू नहीं होता है। कल्पना कीजिए कि आपके कार्यक्रम में एक ऐसी विधि है जो कुछ बहुत ही जटिल कार्यक्षमता को लागू करती है। उदाहरण के तौर पर हम क्या सुझाव दे सकते हैं? मान लीजिए कि आपका रीडडाटाफ्रॉमकॉलिडर () विधि एक डेटा पता इनपुट के रूप में स्वीकार करता है, बाइट प्रारूप में बड़े हैड्रॉन कोलाइडर से डेटा पढ़ता है, इस डेटा को टेक्स्ट में परिवर्तित करता है, इसे फ़ाइल में लिखता है, और इसे प्रिंट करता है। यहां तक ​​कि विधि का वर्णन भी डरावना लगता है, कोड के बारे में कुछ भी नहीं कहने के लिए :) कोड को और अधिक पठनीय बनाने के लिए, सभी विधियों के जटिल तर्क को एक ही स्थान पर नहीं लिखना सबसे अच्छा होगा। इसके बजाय, हमें कार्यक्षमता को अलग-अलग तरीकों से अलग करना चाहिए। उदाहरण के लिए, रीडबाइटडेटा ()विधि डेटा पढ़ने के लिए जिम्मेदार है, ConvertBytesToSymbols () विधि कोलाइडर से पढ़े गए डेटा को पाठ में परिवर्तित करती है, saveToFile () विधि प्राप्त पाठ को फ़ाइल में सहेजती है, और PrintColliderData () विधि हमारी डेटा फ़ाइल को प्रिंट करती है। अंत में, हमारा readDataFromCollider () तरीका बहुत आसान हो जाएगा:
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   public byte[] readByteData(Path pathToData) {

       // Reads data in bytes
   }

   public String[] convertBytesToSymbols(byte[] colliderDataInBytes) {

       // Converts bytes to characters
   }

   public File saveToFile(String[] colliderData) {

       // Saves read data to a file
   }

   public void printColliderData(File fileWithColliderData) {

       // Prints data from the file
   }
}
हालाँकि, जैसा कि आपको इंटरफेस के बारे में पाठ से याद होगा, उपयोगकर्ता को केवल बाहरी इंटरफ़ेस तक ही पहुँच प्राप्त होती है। और हमारे 4 तरीके इसका हिस्सा नहीं हैं। वे सहायक विधियाँ हैं: हमने उन्हें कोड की पठनीयता में सुधार करने और चार अलग-अलग कार्यों को एक विधि में रटने के लिए नहीं बनाया है। आपको उपयोगकर्ता को इन विधियों तक पहुंच प्रदान करने की आवश्यकता नहीं है। यदि उपयोगकर्ताओं के पास कोलाइडर के साथ काम करते समय ConvertBytesToSymbols () विधि तक पहुंच है, तो वे सबसे अधिक संभावना केवल विधि से भ्रमित होंगे और आश्चर्य करेंगे कि यह क्या है। कौन से बाइट परिवर्तित होते हैं? वे कहां से आए थे? उन्हें टेक्स्ट में क्यों बदलें? इस पद्धति में निष्पादित तर्क उपयोगकर्ता के सामने आने वाले इंटरफ़ेस का हिस्सा नहीं है। केवल readDataFromCollider ()विधि इंटरफ़ेस का हिस्सा है। तो हम इन चार 'आंतरिक' तरीकों से क्या करते हैं? सही! उन तक पहुंच सीमित करने के लिए निजी संशोधक का उपयोग करें । ऐसा करने से वे उपयोगकर्ता को भ्रमित किए बिना शांतिपूर्वक कक्षा के अंदर अपना काम कर सकते हैं, जिसे प्रत्येक व्यक्तिगत विधि के तर्क को जानने की आवश्यकता नहीं है।
public class ColliderUtil {

   public void readDataFromCollider(Path pathToData) {
       byte[] colliderData = readByteData(pathToData);
       String[] textData = convertBytesToSymbols(colliderData);
       File fileWithData = saveToFile(textData);
       printColliderData(fileWithData);
   }

   private byte[] readByteData(Path pathToData) {
       // Reads data in bytes
   }

   private String[] convertBytesToSymbols(byte[] colliderDataInBytes) {
       // Converts bytes to characters
   }

   private File saveToFile(String[] colliderData) {
       // Saves read data to a file
   }

   private void printColliderData(File fileWithColliderData) {
       // Prints data from the file
   }
}

संरक्षित संशोधक

अगला सबसे प्रतिबंधात्मक संशोधक संरक्षित है । संरक्षितएक्सेस संशोधक।  निजी, संरक्षित, डिफ़ॉल्ट, सार्वजनिक - 3 पहुँच संशोधक द्वारा चिह्नित फ़ील्ड और विधियाँ दिखाई देंगी:
  • हमारे जैसे ही पैकेज में शामिल सभी वर्गों के भीतर;
  • हमारी कक्षा को प्राप्त करने वाले सभी वर्गों के भीतर।
सबसे पहले, यह कल्पना करना कठिन है कि इसकी आवश्यकता कब हो सकती है। आश्चर्यचकित न हों: निजी की तुलना में संरक्षित के लिए बहुत कम उपयोग के मामले हैं , और वे बहुत विशिष्ट हैं। कल्पना करें कि हमारे पास एक एब्स्ट्रैक्टसेक्रेटएजेंट अमूर्त वर्ग है जो कुछ खुफिया सेवा में एक गुप्त एजेंट का प्रतिनिधित्व करता है, साथ ही एक टॉप_सीक्रेट पैकेज जिसमें यह वर्ग और इसके वंश शामिल हैं। ठोस वर्ग जैसे FBISecretAgent , MI6SecretAgent , MossadSecretAgent , आदि इसे इनहेरिट करते हैं। अमूर्त वर्ग के अंदर, हम एक एजेंट काउंटर लागू करना चाहते हैं। प्रोग्राम में कहीं नया एजेंट बनाए जाने पर यह बढ़ जाएगा। पैकेज टॉप_सीक्रेट;
public abstract class AbstractSecretAgent {

   public static int agentCount = 0;
}
लेकिन हमारे एजेंट गुप्त हैं! इसका मतलब यह है कि उन्हें और किसी और को नहीं पता होना चाहिए कि उनमें से कितने मौजूद हैं। हम आसानी से संरक्षित संशोधक को एजेंट_काउंटर फ़ील्ड में जोड़ सकते हैं। तब हमारे टॉप_सीक्रेट पैकेज में स्थित अन्य गुप्त एजेंट वर्गों और अन्य वर्गों के उदाहरण इसका मूल्य प्राप्त कर सकते हैं।
public abstract class AbstractSecretAgent {

   protected static int agent_counter = 0;
}
और यह उस तरह का विशेष कार्य है जिसके लिए संरक्षित संशोधक की आवश्यकता होती है :)

पैकेज दृश्यमान संशोधक

सूची में अगला डिफ़ॉल्ट संशोधक है, जिसे पैकेज दृश्य संशोधक के रूप में भी जाना जाता है। यह किसी कीवर्ड द्वारा इंगित नहीं किया गया है, क्योंकि जावा इसे डिफ़ॉल्ट रूप से सभी क्षेत्रों और विधियों पर लागू करता है। यदि आप अपने कोड में निम्नलिखित लिखते हैं:
int x = 10
x वेरिएबल में यह पैकेज विज़िबल एक्सेस होगा । यह याद रखना आसान है कि यह क्या करता है। मूल रूप से, डिफ़ॉल्ट = संरक्षित वंशानुक्रम :) संरक्षित संशोधक की तरह, इसका अनुप्रयोग सीमित है। अक्सर, डिफॉल्ट एक्सेस का उपयोग उस पैकेज में किया जाता है जिसमें कुछ उपयोगिता वर्ग होते हैं जो पैकेज में अन्य सभी वर्गों की कार्यक्षमता को लागू नहीं करते हैं। आइए एक उदाहरण देते हैं। कल्पना कीजिए कि हमारे पास एक 'सेवा' पैकेज है। इसमें विभिन्न वर्ग शामिल हैं जो डेटाबेस के साथ काम करते हैं। उदाहरण के लिए, एक उपयोगकर्ता सेवा वर्ग है जो डेटाबेस से उपयोगकर्ता डेटा पढ़ता है, एक कार सेवावर्ग जो एक ही डेटाबेस से कार डेटा पढ़ता है, और अन्य वर्ग, जिनमें से प्रत्येक विशिष्ट प्रकार की वस्तुओं के साथ काम करता है और डेटाबेस से संबंधित डेटा पढ़ता है।
package services;

public class UserService {
}

package services;

public class CarService {
}
लेकिन डेटाबेस में डेटा का एक प्रारूप में होना आसान होगा और हमें दूसरे में इसकी आवश्यकता होगी। कल्पना करें कि डेटाबेस में उपयोगकर्ताओं की जन्मतिथि <TIMESTAMP with TIME ZONE> के रूप में संग्रहीत है ...
2014-04-04 20:32:59.390583+02
... और इसके बजाय हमें सबसे सरल वस्तु - एक java.util.Date की आवश्यकता है । इस समस्या को हल करने के लिए, हम सेवा पैकेज के अंदर एक विशेष मैपर क्लास बना सकते हैं । यह डेटाबेस से डेटा को हमारे परिचित जावा ऑब्जेक्ट में बदलने के लिए जिम्मेदार होगा। एक साधारण सहायक वर्ग। हम आमतौर पर सभी वर्गों को सार्वजनिक वर्ग वर्ग नाम के रूप में घोषित करते हैं , लेकिन यह कोई आवश्यकता नहीं है। हम अपने हेल्पर क्लास को केवल क्लास मैपर के रूप में घोषित कर सकते हैं । इस मामले में, यह अभी भी अपना काम करता है, लेकिन यह सेवा पैकेज के बाहर किसी को दिखाई नहीं देता है !
package services;

class Mapper {
}


package services;

public class CarService {

   Mapper mapper;
}
और यहाँ मूल तर्क है: किसी पैकेज के बाहर किसी को एक सहायक वर्ग को देखने की आवश्यकता क्यों होगी जो केवल उस पैकेज की कक्षाओं के साथ काम करता है?

सार्वजनिक संशोधक

और अंत में, सार्वजनिक संशोधक! आप इस संशोधक से CodeGym पर अपने अध्ययन के पहले दिन पहली बार public static void main(String[] args) चला रहे थे । पहुँच संशोधक।  निजी, संरक्षित, डिफ़ॉल्ट, सार्वजनिक - 4अब जब आपने इंटरफेस के बारे में पाठ का अध्ययन कर लिया है, तो इसका उद्देश्य आपके लिए स्पष्ट है :) आखिरकार, सार्वजनिक संशोधक उपयोगकर्ताओं को कुछ देने के लिए बनाया गया था। उदाहरण के लिए, आपके प्रोग्राम का इंटरफ़ेस। मान लीजिए आपने एक अनुवादक प्रोग्राम लिखा है जो रूसी पाठ का अंग्रेजी में अनुवाद कर सकता है। आपने एक अनुवाद (स्ट्रिंग टेक्स्टइनरूसी) विधि बनाई है जो सभी आवश्यक तर्कों को लागू करती है। आपने इस विधि को सार्वजनिक शब्द से चिह्नित किया है , और अब यह इंटरफ़ेस का हिस्सा है:
public class Translator {

   public String translate(String textInRussian) {

       // Translates text from Russian to English
   }
}
आप इस विधि को स्क्रीन पर 'अनुवाद' बटन से बांध सकते हैं और आपका काम हो गया! इसे कोई भी इस्तेमाल कर सकता है। सार्वजनिक संशोधक के साथ चिह्नित कोड के हिस्से अंतिम उपयोगकर्ता के लिए अभिप्रेत हैं। वास्तविक जीवन का उदाहरण प्रदान करते हुए, निजी एक टीवी के अंदर होने वाली सभी प्रक्रियाओं के लिए है, लेकिन सार्वजनिक टीवी को प्रबंधित करने के लिए उपयोग किए जाने वाले रिमोट कंट्रोल के बटनों के लिए है। क्या अधिक है, उपयोगकर्ता को यह जानने की आवश्यकता नहीं है कि टेलीविजन कैसे बनाया जाता है या यह कैसे काम करता है। रिमोट कंट्रोल सार्वजनिक -विधियों का सेट है : ऑन () , ऑफ () , नेक्स्टचैनल () , पिछला चैनल () , वृद्धि वॉल्यूम () , घटाव वॉल्यूम () आदि ।आपने जो सीखा है उसे सुदृढ़ करने के लिए, हमारा सुझाव है कि आप हमारे जावा कोर्स से एक वीडियो सबक देखें
टिप्पणियां
  • लोकप्रिय
  • नया
  • पुराना
टिप्पणी लिखने के लिए आपको साइन इन करना होगा
इस पेज पर अभी तक कोई टिप्पणियां नहीं हैं