java - जावा में एक निजी स्थैतिक चर का उपयोग क्या है?




variables static private (17)

यदि एक चर को public static varName; रूप में घोषित किया गया है public static varName; , तो मैं इसे कहीं भी ClassName.varName रूप में एक्सेस कर सकता हूं। मुझे यह भी पता है कि स्थिर सदस्यों को कक्षा के सभी उदाहरणों द्वारा साझा किया जाता है और प्रत्येक उदाहरण में पुन: आवंटित नहीं किया जाता है।

एक वैरिएबल को private static varName; रूप में घोषित कर रहा है private static varName; एक परिवर्तनीय private varName; घोषित करने से कोई अलग private varName; ?

दोनों मामलों में इसे किसी अन्य वर्ग से ClassName.varName या ClassInstance.varName रूप में एक्सेस नहीं किया जा सकता है।

वैरिएबल को स्थिर के रूप में घोषित करने से यह अन्य विशेष गुण देता है?


Answers

यदि आप अपनी कक्षा में निजी स्थैतिक चर का उपयोग करते हैं, तो आपकी कक्षा में स्टेटिक इनर क्लासेस आपके चर तक पहुंच सकते हैं। संदर्भ सुरक्षा के लिए यह पूरी तरह से अच्छा है।


स्टेटिक वैरिएबल वे वेरिएबल्स हैं जो कक्षा के सभी उदाहरणों के लिए आम हैं .. अगर एक उदाहरण इसे बदलता है .. तो स्थिर वैरिएबल का मूल्य अन्य सभी उदाहरणों के लिए अपडेट किया जाएगा


*) यदि एक चर को निजी के रूप में घोषित किया जाता है तो यह वर्ग के बाहर दिखाई नहीं देता है। इसे दैटहाइडिंग कहा जाता है।

*) यदि एक चर को स्थिर के रूप में घोषित किया गया है तो वैरिएबल का मान सभी उदाहरणों के लिए समान है और हमें उस variable को कॉल करने के लिए ऑब्जेक्ट बनाने की आवश्यकता नहीं है। हम उस चर को आसानी से कॉल कर सकते हैं

classname.variablename;


थ्रेडलोकल चर आमतौर पर निजी स्थिर के रूप में लागू होते हैं। इस तरह, वे कक्षा से बंधे नहीं हैं और प्रत्येक धागे का अपना "थ्रेड लोकल" ऑब्जेक्ट का अपना संदर्भ है।


एक निजी स्थैतिक वर्ग चर का उपयोग क्या है?

मान लीजिए कि आपके पास लाइब्रेरी बुक क्लास है। प्रत्येक बार जब आप एक नई पुस्तक बनाते हैं, तो आप इसे एक अद्वितीय आईडी असाइन करना चाहते हैं। एक तरीका यह है कि बस 0 से शुरू करें और आईडी नंबर बढ़ाएं। लेकिन, आखिरी बनाई गई आईडी संख्या को अन्य सभी पुस्तकों को कैसे पता चलेगा? सरल, इसे स्थिर चर के रूप में सहेजें। क्या संरक्षकों को यह जानने की ज़रूरत है कि वास्तविक आंतरिक आईडी संख्या प्रत्येक पुस्तक के लिए है? नहीं, वह जानकारी निजी है।

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

यह एक संक्षिप्त उदाहरण है, लेकिन मुझे यकीन है कि आप उन मामलों के बारे में आसानी से सोच सकते हैं जहां आप सभी कक्षा के उदाहरणों को सामान्य जानकारी तक पहुंच प्राप्त करना चाहते हैं जिन्हें हर किसी से निजी रखा जाना चाहिए। या यहां तक ​​कि यदि आप नहीं कर सकते हैं, तो यह चीजों को यथासंभव निजी बनाने के लिए अच्छा प्रोग्रामिंग अभ्यास है। क्या होगा यदि आपने गलती से उस numBooks क्षेत्र को सार्वजनिक किया, भले ही पुस्तक उपयोगकर्ताओं को इसके साथ कुछ भी करने की आवश्यकता न हो। फिर कोई नई पुस्तक बनाने के बिना किताबों की संख्या बदल सकता है।

बहुत चुस्त!


एक वैरिएबल को private static varName; रूप में घोषित कर रहा है private static varName; एक परिवर्तनीय private varName; घोषित करने से कोई अलग private varName; ?

हाँ, दोनों अलग हैं। और पहले को class variable कहा जाता class variable क्योंकि इसमें उस class लिए एकल मान होता है जबकि दूसरे को instance variable कहा जाता instance variable क्योंकि यह विभिन्न instances(Objects) लिए अलग-अलग मान रख सकता है। पहला व्यक्ति जेवीएम में केवल एक बार बनाया जाता है और दूसरा प्रति उदाहरण एक बार बनाया जाता है यानी यदि आपके पास 10 उदाहरण हैं तो आपके पास 10 अलग-अलग private varName; जेवीएम में

वैरिएबल को static रूप में घोषित करने से यह अन्य विशेष गुण देता है?

हां, स्थैतिक चर सामान्य आवृत्ति चर से कुछ अलग गुण प्राप्त करता है। मैंने पहले से ही कुछ का उल्लेख किया है और चलिए कुछ यहां देखें: class variables (इंस्टेंस वेरिएबल्स जिन्हें स्थिर के रूप में घोषित किया जाता है) को ClassName.varName जैसे क्लास नाम का उपयोग करके सीधे एक्सेस किया जा सकता है। और उस वर्ग का कोई भी ऑब्जेक्ट इसके मूल्य को एक्सेस और संशोधित कर सकता है जैसे कि इंस्टेंस चर के केवल अपने संबंधित ऑब्जेक्ट्स तक पहुंचा जा सकता है। कक्षा चर का उपयोग स्थिर तरीकों से किया जा सकता है।

जावा में एक private static variable का उपयोग क्या है?

तार्किक रूप से, private static variable public static variable से अलग नहीं है बल्कि पहला आपको अधिक नियंत्रण देता है। आईएमओ, आप public static चरखी और सेटटर विधियों की सहायता से private static variable द्वारा public static variable को प्रतिस्थापित कर सकते हैं।

private static variable का एक व्यापक रूप से उपयोग किया जाने वाला क्षेत्र सरल Singleton पैटर्न के कार्यान्वयन में है जहां आपके पास पूरी दुनिया में उस वर्ग का केवल एक उदाहरण होगा। यहां static पहचानकर्ता बाहरी भूमिका से सुलभ होने के लिए महत्वपूर्ण भूमिका निभाता है (बेशक सार्वजनिक स्थैतिक गेटर विधि भी मुख्य भूमिका निभाती है)।

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}

निजी स्थिर चर subclass में भी साझा किया जाएगा। यदि आप एक सबक्लास में बदल गए हैं और अन्य सबक्लास को बदले गए मूल्य मिलेंगे, तो इस मामले में, यह आपकी अपेक्षा नहीं हो सकता है।

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}

यदि एक चर को सार्वजनिक स्थैतिक के रूप में परिभाषित किया गया है तो इसे किसी भी वर्ग से अपने वर्ग के नाम से एक्सेस किया जा सकता है।

आम तौर पर कार्यों को सार्वजनिक स्थैतिक के रूप में परिभाषित किया जाता है जिसे केवल कार्यान्वयन वर्ग नाम पर कॉल करके एक्सेस किया जा सकता है।

इसका एक बहुत अच्छा उदाहरण थ्रेड क्लास में sleep() विधि है

Thread.sleep(2500);

यदि एक चर को निजी स्थैतिक के रूप में परिभाषित किया जाता है तो इसे केवल उस कक्षा के भीतर ही पहुंचा जा सकता है, इसलिए किसी भी वर्ग का नाम आवश्यक नहीं है या आप अभी भी कक्षा का नाम (आप तक) का उपयोग कर सकते हैं। निजी var_name और निजी स्थैतिक var_name के बीच का अंतर यह है कि निजी स्थैतिक चर केवल कक्षा के स्थिर तरीकों से ही पहुंचा जा सकता है जबकि निजी चर को उस वर्ग की किसी भी विधि (स्थिर विधियों को छोड़कर) तक पहुंचा जा सकता है।

इसका एक बहुत अच्छा उदाहरण डेटाबेस कनेक्शन या स्थिरांक को परिभाषित करते समय है, जो वैरिएबल को निजी स्थिर के रूप में घोषित करने की आवश्यकता है।

एक और आम उदाहरण है

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}

वैसे आप सही सार्वजनिक स्थैतिक चर का उपयोग कक्षा के उदाहरण के बिना किया जाता है लेकिन निजी स्थैतिक चर नहीं हैं। उनके बीच मुख्य अंतर और जहां मैं निजी स्थैतिक चर का उपयोग करता हूं वह तब होता है जब आपको स्थैतिक फ़ंक्शन में चर का उपयोग करने की आवश्यकता होती है। स्थैतिक कार्यों के लिए आप केवल स्थिर चर का उपयोग कर सकते हैं, ताकि आप उन्हें अन्य वर्गों से एक्सेस न करने के लिए निजी बना सकें। यही एकमात्र मामला है जिसके लिए मैं निजी स्थिर का उपयोग करता हूं।

यहाँ एक उदाहरण है:

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}

एक और परिप्रेक्ष्य:

  1. रनटाइम पर एक वर्ग और इसका उदाहरण दो अलग-अलग चीजें हैं। उस वर्ग के सभी उदाहरणों द्वारा एक वर्ग की जानकारी "साझा" होती है।
  2. गैर स्थैतिक वर्ग चर उदाहरणों से संबंधित हैं और स्थैतिक चर वर्ग से संबंधित हैं।
  3. एक उदाहरण चर की तरह निजी या सार्वजनिक हो सकता है, स्थैतिक चर भी निजी या सार्वजनिक हो सकते हैं।

कुछ लोगों के लिए यह अधिक समझ में आता है अगर वे इसे दो अलग-अलग भाषाओं में देखते हैं, इसलिए मैंने जावा में एक उदाहरण लिखा, और मेरे पृष्ठ पर PHP जहां मैंने इनमें से कुछ संशोधक समझाए। आप इस बारे में गलत तरीके से सोच रहे होंगे।

यदि आप नीचे समझ में नहीं आते हैं तो आपको मेरे उदाहरणों को देखना चाहिए। यहां http://www.siteconsortium.com/h/D0000D.php

हालांकि नीचे की रेखा यह है कि यह बिल्कुल वैसा ही है जो यह कहता है। यह एक स्थिर सदस्य चर है जो निजी है। उदाहरण के लिए यदि आप सिंगलटन ऑब्जेक्ट बनाना चाहते हैं तो आप SingletonExample.instance चर सार्वजनिक क्यों बनाना चाहते हैं। यदि आपने ऐसा व्यक्ति किया जो वर्ग का उपयोग कर रहा था तो वह आसानी से मूल्य को ओवरराइट कर सकता था।

यह सब कुछ है।

    public class SingletonExample {
      private static SingletonExample instance = null;
      private static int value = 0;
      private SingletonExample() {
        ++this.value;
      }
      public static SingletonExample getInstance() {
        if(instance!=null)
        return instance;
        synchronized(SingletonExample.class) {
        instance = new SingletonExample();
        return instance;
        }
      }
      public void printValue() {
        System.out.print( this.value );
      }

      public static void main(String [] args) {
        SingletonExample instance = getInstance();
        instance.printValue();
        instance = getInstance();
        instance.printValue();
         }
    }


निम्नलिखित उदाहरण में, पर्सनबी द्वारा eye बदल दी जाती है, जबकि leg वही रहता है। ऐसा इसलिए है क्योंकि एक निजी चर विधि की प्रतिलिपि बनाता है , ताकि उसका मूल मान समान रहता है; जबकि एक निजी स्थैतिक मूल्य में साझा करने के सभी तरीकों के लिए केवल एक प्रति है , इसलिए इसके मूल्य को संपादित करने से उसका मूल मूल्य बदल जाएगा।

public class test {
private static int eye=2;
private int leg=3;

public test (int eyes, int legs){
    eye = eyes;
    leg=leg;
}

public test (){
}

public void print(){
    System.out.println(eye);
    System.out.println(leg);
}

public static void main(String[] args){
    test PersonA = new test();      
    test PersonB = new test(14,8);
    PersonA.print();    
}

}

> 14 3


मैं जावा के लिए नया हूं, लेकिन एक तरह से मैं स्थैतिक चर का उपयोग करता हूं, क्योंकि मुझे लगता है कि कई लोग करते हैं, कक्षा के उदाहरणों की संख्या को गिनना है। उदाहरण के लिए:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

फिर आप sysout कर सकते हैं:

Company.getNumCompanies();

आप कक्षा के प्रत्येक उदाहरण (जिसे मैं पूरी तरह से समझ नहीं पा रहा हूं) से numCompanies तक पहुंच प्राप्त कर सकता हूं, लेकिन यह "स्थैतिक तरीके" में नहीं होगा। मुझे नहीं पता कि यह सबसे अच्छा अभ्यास है या नहीं, लेकिन यह मुझे समझ में आता है।


निजी स्थैतिक चर उसी तरह उपयोगी होते हैं जैसे निजी आवृत्ति चर उपयोगी होते हैं: वे राज्य को संग्रहीत करते हैं जिसे केवल उसी कक्षा के भीतर कोड द्वारा एक्सेस किया जाता है। अभिगम्यता (निजी / सार्वजनिक / आदि) और चर की आवृत्ति / स्थैतिक प्रकृति पूरी तरह से ऑर्थोगोनल अवधारणाएं हैं।

मैं कक्षा के "सभी उदाहरणों" के बीच साझा होने के रूप में स्थिर चर के बारे में सोचने से बचूंगा - जो बताता है कि राज्य के लिए कम से कम एक उदाहरण होना चाहिए। नहीं - प्रकार के किसी भी उदाहरण के बजाय एक स्थिर चर प्रकार के साथ जुड़ा हुआ है।

इसलिए जब भी आप किसी विशेष घटना के बजाय किसी प्रकार से जुड़े राज्य को चाहते हैं, और आप उस राज्य को निजी रखना चाहते हैं (उदाहरण के लिए गुणों के माध्यम से नियंत्रित पहुंच की इजाजत देना) तो यह एक निजी स्थैतिक चर होना समझ में आता है।

एक तरफ, मैं दृढ़ता से अनुशंसा करता हूं कि एकमात्र प्रकार के चर जो आप सार्वजनिक करते हैं (या यहां तक ​​कि गैर-निजी) स्थिर हैं - अपरिवर्तनीय प्रकार के स्थिर अंतिम चर। एपीआई और कार्यान्वयन (अन्य चीजों के साथ) को अलग करने के लिए बाकी सब कुछ निजी होना चाहिए।


जब एक स्थिर विधि में आप एक चर का उपयोग करते हैं, तो चर को एक उदाहरण के रूप में स्थिर भी होना चाहिए:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}

खैर, उस वर्ग के उदाहरणों के दौरान डेटा साझा करने के लिए private static चर का उपयोग किया जा सकता है। जबकि आप सही हैं कि हम ClassName.member या ClassInstance.member जैसी संरचनाओं का उपयोग करके private static चर का उपयोग नहीं कर सकते हैं, लेकिन सदस्य हमेशा उस वर्ग या उस वर्ग के उदाहरणों से दिखाई देंगे। तो उस वर्ग के प्रभाव के उदाहरण हमेशा सदस्य को संदर्भित करने में सक्षम होंगे।


सी ++ 11 में स्थिर निर्माण

चूंकि सी ++ 11, स्थिर निर्माण लैम्ब्डा फ़ंक्शन प्रारंभकर्ताओं के माध्यम से कार्यान्वित किया जा सकता है। इसके लिए आपको किसी भी सहायक वर्ग का उपयोग करने की ज़रूरत नहीं है।

स्टेटिक सदस्य कन्स्ट्रक्टर

शीर्ष लेख फ़ाइल:

class MyClass {
    static vector<char> letters;
};

मूल फाइल:

vector<char> MyClass::letters = [] {
    vector<char> letters;
    for (char c = 'a'; c <= 'z'; c++) {
         letters.push_back(c);
    }
    return letters;
}();

स्टेटिक क्लास कन्स्ट्रक्टर

शीर्ष लेख फ़ाइल:

class Foo {
    static Bar staticMember1;
    static Bar staticMember2;
    static const bool StaticCtor;    // Note: must be the last static member
};

मूल फाइल:

Bar Foo::staticMember1;
Bar Foo::staticMember2;

const bool Foo::StaticCtor = [] {
    staticMember1 = ... ;
    staticMember2 = ... ;
    return true;             // Note: unused dummy return value
}();




java variables static private