java - जावा में स्टेटिक क्लासेस




static-classes (6)

एक स्थिर नेस्टेड वर्ग है , यह [स्थैतिक घोंसला] वर्ग को तत्काल होने के लिए संलग्न वर्ग के उदाहरण की आवश्यकता नहीं है।

ये वर्ग [स्थैतिक घोंसले वाले] केवल संलग्न वर्ग के स्थिर सदस्यों तक पहुंच सकते हैं [क्योंकि इसमें संलग्न वर्ग के उदाहरणों का कोई संदर्भ नहीं है ...]

कोड नमूना:

public class Test { 
  class A { } 
  static class B { }
  public static void main(String[] args) { 
    /*will fail - compilation error, you need an instance of Test to instantiate A*/
    A a = new A(); 
    /*will compile successfully, not instance of Test is needed to instantiate B */
    B b = new B(); 
  }
}

क्या जावा में static class तरह कुछ भी है?

इस तरह के वर्ग का अर्थ क्या है। क्या स्थिर वर्ग के सभी तरीकों को static भी होना चाहिए?

क्या इसे दूसरे तरीके से जरूरी है, कि यदि किसी वर्ग में सभी स्थैतिक तरीकों को शामिल किया गया है, तो क्या कक्षा स्थिर भी होगी?

स्थिर वर्ग क्या अच्छे हैं?


क्या हो रहा है जब class भीतर एक सदस्य static रूप में घोषित किया जाता है ..? class को तत्काल किए बिना उन सदस्यों तक पहुंचा जा सकता है। इसलिए बाहरी वर्ग (शीर्ष स्तर की कक्षा) static का कोई अर्थ नहीं है। इसलिए इसकी अनुमति नहीं है।

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

public class A {
    public static class B {

    }
}

अब, एक अलग वर्ग C अंदर, कक्षा B को कक्षा A का उदाहरण दिए बिना एक्सेस किया जा सकता है।

public class C {
    A.B ab = new A.B();
}

static वर्गों में non-static सदस्य भी हो सकते हैं। केवल कक्षा स्थिर हो जाती है।

लेकिन यदि कक्षा B से static कीवर्ड हटा दिया गया है, तो इसे A उदाहरण के बिना सीधे एक्सेस नहीं किया जा सकता है।

public class C {
    A a = new A();
    A.B ab = a. new B();
}

लेकिन हमारे पास एक non-static आंतरिक कक्षा के भीतर static सदस्य नहीं हो सकते हैं।


जावा में स्थिर नेस्टेड कक्षाएं हैं लेकिन ऐसा लगता है कि आप एक शीर्ष-स्तरीय स्थैतिक वर्ग की तलाश में हैं। जावा के पास शीर्ष-स्तरीय वर्ग स्थिर बनाने का कोई तरीका नहीं है लेकिन आप इस तरह की स्थिर कक्षा का अनुकरण कर सकते हैं:

  • अपने वर्ग को final घोषित करें - एक स्थिर वर्ग को विस्तारित करने के बाद कक्षा के विस्तार को रोकता है, इसका कोई मतलब नहीं है
  • कन्स्ट्रक्टर को private बनाएं - क्लाइंट कोड द्वारा तत्कालता को रोकता है क्योंकि इसे स्थिर वर्ग को तुरंत चालू करने का कोई मतलब नहीं है
  • कक्षा के सभी सदस्यों और कार्यों को static बनाएं - चूंकि वर्ग को तत्काल नहीं किया जा सकता है, इसलिए कोई उदाहरण विधि नहीं कहा जा सकता है या उदाहरण फ़ील्ड का उपयोग किया जा सकता है
  • ध्यान दें कि संकलक आपको एक उदाहरण (गैर स्थैतिक) सदस्य घोषित करने से नहीं रोकेगा। यह मुद्दा केवल तभी दिखाया जाएगा जब आप इंस्टेंस सदस्य को कॉल करने का प्रयास करते हैं

ऊपर से प्रति सुझावों का सरल उदाहरण:

public class TestMyStaticClass {
     public static void main(String []args){
        MyStaticClass.setMyStaticMember(5);
        System.out.println("Static value: " + MyStaticClass.getMyStaticMember());
        System.out.println("Value squared: " + MyStaticClass.squareMyStaticMember());
        // MyStaticClass x = new MyStaticClass(); // results in compile time error
     }
}

// A top-level Java class mimicking static class behavior
public final class MyStaticClass {
    private MyStaticClass () { // private constructor
        myStaticMember = 1;
    }
    private static int myStaticMember;
    public static void setMyStaticMember(int val) {
        myStaticMember = val;
    }
    public static int getMyStaticMember() {
        return myStaticMember;
    }
    public static int squareMyStaticMember() {
        return myStaticMember * myStaticMember;
    }
}

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


जावा में स्थिर विधियां हैं जो कक्षाओं से जुड़ी हैं (जैसे java.lang.Math में केवल स्थिर विधियां हैं), लेकिन कक्षा स्वयं स्थिर नहीं है।


यह देखते हुए कि "स्थिर वर्ग जावा" के लिए Google पर यह शीर्ष परिणाम है और सबसे अच्छा जवाब यहां नहीं है, मुझे लगा कि मैं इसे जोड़ूंगा। मैं सी # में स्थैतिक कक्षाओं के संबंध में ओपी के प्रश्न की व्याख्या कर रहा हूं, जिसे जावा दुनिया में सिंगलेट्स के नाम से जाना जाता है। उन लोगों के लिए अनजान, सी # में "स्थैतिक" कीवर्ड को कक्षा घोषणा पर लागू किया जा सकता है जिसका अर्थ है कि परिणामस्वरूप वर्ग को तत्काल नहीं किया जा सकता है।

जोशुआ ब्लोच द्वारा "प्रभावी जावा - द्वितीय संस्करण" से उद्धरण (व्यापक रूप से उपलब्ध सर्वश्रेष्ठ जावा स्टाइल मार्गदर्शिकाओं में से एक माना जाता है):

रिलीज 1.5 के रूप में, सिंगलेट्स को लागू करने के लिए तीसरा दृष्टिकोण है। बस एक तत्व के साथ एक enum प्रकार बनाओ:

// Enum singleton - the preferred approach
public enum Elvis {
    INSTANCE;
    public void leaveTheBuilding() { ... }
}

यह दृष्टिकोण सार्वजनिक क्षेत्र के दृष्टिकोण के कार्यात्मक रूप से समतुल्य है, सिवाय इसके कि यह अधिक संक्षिप्त है, धारावाहिक मशीनरी को मुफ्त में प्रदान करता है, और परिष्कृत क्रमिकरण या प्रतिबिंब हमलों के सामने भी कई तत्कालता के खिलाफ लोहे की गारंटी प्रदान करता है। हालांकि इस दृष्टिकोण को व्यापक रूप से अपनाया जाना बाकी है, एक एकल तत्व enum प्रकार एक सिंगलटन को लागू करने का सबसे अच्छा तरीका है। (जोर लेखक की)

ब्लोच, जोशुआ (2008-05-08)। प्रभावी जावा (जावा श्रृंखला) (पृष्ठ 18)। पियरसन शिक्षा।

मुझे लगता है कि कार्यान्वयन और औचित्य सुंदर आत्म व्याख्यात्मक हैं।


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

उदाहरण:

public class A
{

 public static class B
 {
 }
}

चूंकि class B को स्थैतिक घोषित किया गया है, इसलिए आप स्पष्ट रूप से तत्काल तत्काल कर सकते हैं:

B b = new B();

ध्यान दें कि class B को अकेले खड़े होने के लिए स्थैतिक घोषित नहीं किया गया था, उदाहरण के लिए एक ऑब्जेक्ट ऑब्जेक्ट कॉल इस तरह दिखाई देगी:

A a= new A();
B b = a.new B();




static-classes