2012-08-22 16 views
15

मैं कुछ कोड के माध्यम से जा रहा था अंदर सार्वजनिक स्थैतिक कक्षा है और मैं इसे देखा:क्यों एक वर्ग

public class A { 
    public A(SomeObject obj) { 
     //Do something 
    } 
    //Some stuff 
    public static class B { 
    //Some other stuff 
    } 
} 

मैं सोच रहा था के बाद से भी भीतरी वर्ग public कारण है कि यह रूप में नेस्ट किया है और नहीं एक अलग वर्ग है? इसके अलावा, क्या मैं इसे यहां कर सकता हूं: new A.B(SomeObject)? मुझे लगता है कि यह एक स्थिर वर्ग के उद्देश्य को हरा देता है लेकिन मैंने इस कार्यान्वयन को भी देखा था, इसलिए जानना चाहता था।

उत्तर

17

मैं सोच रहा था क्योंकि यहां तक ​​कि आंतरिक वर्ग भी सार्वजनिक है क्योंकि यह घोंसला के रूप में क्यों है और अलग वर्ग नहीं है?

वास्तव में यह पूछना एक बात है कि जिसने कक्षा लिखी है। यह बाहरी वर्ग को "मिनी-नेमस्पेस" के रूप में कार्य करने की अनुमति दे सकता है - यदि नेस्टेड क्लास केवल बाहरी वर्ग के संदर्भ में उपयोगी है, तो यह उचित लगता है। यह दो वर्गों के बीच जानबूझकर तंग युग्मन को इंगित करता है।मैं सबसे अधिक बार बिल्डर पैटर्न के संदर्भ में यह देखें:

Foo foo = new Foo.Builder().setBar(10).build(); 

यहाँ यह मेरे लिए समझ में आता है Foo.BuilderFoo भीतर के बजाय एक सहकर्मी वर्ग जो संभवतः FooBuilder ही कहा जाता है के रूप में नेस्ट है।

ध्यान दें कि यह केवल असंबंधित वर्गों की तुलना में कुछ दृश्यता अंतर भी देता है।

इसके अलावा, क्या मैं इसे यहां कर सकता हूं: new A.B(SomeObject)?

नहीं, क्योंकि B एक SomeObject पैरामीटर के साथ एक निर्माता नहीं है - केवल A करता है (उदाहरण में आपके द्वारा दिए गए)।

मैं यह एक स्थिर वर्ग के उद्देश्य धरा

आप बाहर काम करने के बिल्कुल आप क्या समझे होने के लिए एक स्थिर वर्ग के उद्देश्य के लिए प्रयास करना चाहिए, और क्या तरीके से इस धरा है कि लग रहा है उद्देश्य। वर्तमान में यह यथार्थवादी चर्चा के लिए एक बयान बहुत अस्पष्ट है।

+0

अच्छा स्पष्टीकरण जॉन .. मुझसे +1 .. – pratikabu

5

तुम इतनी

  • आप एक वर्ग है जो केवल बाहरी वर्ग समझाया समर्थन करने के लिए मौजूद है रख सकते इस तरह एक आंतरिक वर्ग होगा।
  • आप बाहरी कक्षा या अन्य नेस्टेड कक्षाओं के private सदस्यों तक पहुंचने में सक्षम होना चाहते हैं।
  • आप स्थिर क्षेत्रों के साथ एक नेस्टेड वर्ग चाहते हैं (एक कमजोर कारण मुझे पता है;)
  • आप Lock या Sync की तरह एक बहुत ही सामान्य नाम के साथ एक वर्ग है जिसकी सहायता से आप के अन्य वर्गों के साथ मिलाया जा नहीं करना चाहते उसी पैकेज में कक्षाओं द्वारा उपयोग किया जाने वाला नाम।

मैं इस यहाँ कर सकते हैं: नई a.b (SomeObject)?

आप कर सकते हैं।

मैं

यह लेकिन एक बार आप शुरू आप मुसीबत एक file.java में अपने पूरे कार्यक्रम बदल नहीं हो सकता है के लिए इस्तेमाल किया जा रहा लेता है यह एक स्थिर वर्ग के उद्देश्य धरा लग रहा है;)

2

मैं सोच रहा था क्योंकि यहां तक ​​कि आंतरिक वर्ग भी सार्वजनिक है क्यों इसे घोंसला के रूप में और अलग वर्ग नहीं है? नई a.b (SomeObject): Why strange naming convention of "AlertDialog.Builder" instead of "AlertDialogBuilder" in Android

इसके अलावा, मैं इस यहाँ कर सकते हैं:

इस सूत्र पर एक नज़र है?

(अद्यतन) नहीं, आप के बाद से बी एक निर्माता कि SomeObject के लिए पूछता नहीं है ऐसा नहीं कर सकते।

मुझे उम्मीद है कि इससे मदद मिलती है।

+0

आपका लिंक वर्तमान में अंतिम उत्तर को इंगित करता है। मैं इसके बजाय इस लिंक का सुझाव दूंगा http://stackoverflow.com/questions/11810345/why-strange-namimg-convention-of-alertdialog-builder-instead-of-alertdialogbu –

+0

मुझे लगता है कि आपका उत्तर 'नया एबी (कुछ ऑब्जेक्ट) 'नीचे दिए गए अन्य उत्तरों के अनुसार, जो वास्तव में समझ में आता है क्योंकि स्थैतिक वर्ग – noMAD

+0

के लिए कोई कन्स्ट्रक्टर नहीं है क्षमा करें, मेरा बुरा, आपका सही है, मैंने अपडेट किया है। –

0

मैं सोच रहा था के बाद से भी भीतरी वर्ग सार्वजनिक वजह है कि यह नेस्टेड और नहीं एक अलग वर्ग के रूप में है?

पैकेजिंग सुविधा की अनुमति देने का सरल कारण यह है।

Static nested class in Java, why?

http://docs.oracle.com/javase/tutorial/java/javaOO/nested.html

हाँ, आप नए A.B(SomeObject) कर सकते हैं। लेकिन आपको इसके लिए मेरा शब्द नहीं लेना है, इसे आज़माएं।

2

1.static inner कक्षा Top-Level कक्षा के रूप में जाना जाता है।

2. यह static class इसकी बाहरी वर्ग स्टेटिक विधि और चर के सीधी पहुँच है।

3. आप बाहर से इस तरह से static Inner class प्रारंभ करने की आवश्यकता होगी ...

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

4.new A.B(SomeObject) काम नहीं करेगा ... क्योंकि आप डॉन ' टी के साथ SomeObject पैरामीटर के रूप में

5. लेकिन जब आंतरिक वर्ग गैर स्थैतिक है, तो उसके पास बाहरी वर्ग का निहित संदर्भ है।

6। बाहरी और आंतरिक वर्ग विभिन्न कक्षाओं तक फैली हुई है।

7. एक interface's method, एक बार अलग या एक ही तरीके में से अधिक लागू किया जा सकता इनर कक्षा का उपयोग कर।

2

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

public class AnObject { 
    public static class AnObjectBuilder { 

     private AnObject anObject; 

     private AnObjectBuilder() { 
     } 

     private void newAnObjectWithMandatory(String someMandatoryField, ...) { 
      anObject = new AnObject(someMandatoryField,...) 
     } 

     public AnObjectBuilder withSomeOptionalField(String opt) { 
      ... 
     } 
    } 

    public static AnObjectBuilder fooObject() { 
     return (new AnObjectBuilder()).newAnObjectWithMandatory("foo") 
    } 

    public static AnObjectBuilder barObject() { 
     return (new AnObjectBuilder()).newAnObjectWithMandatory("bar") 
    } 
} 

इस तरह ग्राहक कोड पहले वैकल्पिक बिल्डर विधियों का उपयोग करने AnObjectBuilder वर्ग पर स्थिर विधि कॉल और फिर करना होगा: बिल्डर वस्तु बनाने के बिना

AnObject.fooObject("foo").withSomeOptionalField("xxx").build();

सुंदर पठनीय :)

+0

उदाहरण के लिए धन्यवाद। – noMAD

संबंधित मुद्दे