2015-05-12 6 views
9

मान लीजिए कि हमें इस वर्ग और उसके भीतरी वर्ग है:एक आंतरिक कक्षा में फ़ील्ड तक पहुंचने के लिए अनुशंसित/सही तरीका क्या है?

/* Outer.java */ 
public class Outer { 
    private static class Inner { 
     private final Object foo; 

     public Inner(Object foo) { 
      this.foo = foo; 
     } 

     public Object getFoo() { 
      return foo; 
     } 
    } 

    Inner inner = parse(/* someMistery */); 

    // Question: to access foo, which is recommended? 
    Object bar = inner.getFoo(); 
    Object baz = inner.foo; 
} 

मैं कर रहा हूँ कि inner.foo काम करता है आश्चर्य।

foo के बाद से सही private है, यह केवल पहुँचा जा सकता है getFoo() के माध्यम से,?

+1

जावा एक्सेस नियम जटिल छोड़ दिए गए हैं (यहां तक ​​कि 'संरक्षित' के लिए भी अधिक)। लेकिन अगर यह काम करता है, तो आपको खुश होना चाहिए, शिकायत क्यों करें :) – ZhongYu

उत्तर

11

चूंकि foo निजी है, तो इसे केवल getFoo() के माध्यम से एक्सेस किया जा सकता है, है ना? क्योंकि InnerOuter का एक सदस्य है

इस मामले में, Outer भी उस तक पहुँच गया है।

6.6.1 का कहना है:

सदस्य या निर्माता private घोषित किया जाता है [तो], [तो] पहुँच यदि और केवल यदि यह शीर्ष स्तर वर्ग के शरीर कि घोषणा encloses भीतर होता है की अनुमति दी है सदस्य या निर्माता का।

ध्यान दें कि यह निर्दिष्ट शीर्ष स्तर वर्ग कि घोषणा encloses के शरीर के भीतर सुलभ होने के लिए।

इसका मतलब यह है, उदाहरण के लिए:

class Outer { 
    static class Foo { 
     private Foo() {} 
     private int i; 
    } 
    static class Bar {{ 
     // Bar has access to Foo's 
     // private members too 
     new Foo().i = 2; 
    }} 
} 

एक गेटर उपयोग करने के लिए किया जाए या नहीं वास्तव में स्वाद की बात है। यहां महत्वपूर्ण अहसास यह है कि बाहरी वर्गों के पास अपने घोंसले वर्गों के निजी सदस्यों तक पहुंच है।

एक सिफारिश के रूप में, मैं व्यक्तिगत रूप से कह सकते हैं कि:

  • नेस्टेड वर्ग private है (केवल बाहरी वर्ग यह तक पहुँच गया है), मैं भी यह एक गेटर दे रही है, जब तक गेटर करता है परेशान नहीं हैं एक गणना यह मनमाने ढंग से है, और कोई और साथ आ सकता है और इसका उपयोग नहीं करना चुन सकता है। यदि शैलियों को मिश्रित किया जाता है, तो कोड में एक अस्पष्टता होती है। (inner.foo और inner.getFoo() वास्तव में वही काम करते हैं? हमें पता लगाने के लिए Inner कक्षा की जांच करने के लिए बर्बाद समय जाना होगा।)
  • लेकिन अगर आप जिस शैली के साथ सहज हैं, तो आप एक गेटटर के माध्यम से जा सकते हैं।
  • यदि नेस्टेड क्लास private नहीं है, तो गेटर का उपयोग करें ताकि शैली एक समान हो।

तुम सच में, private सदस्यों को छिपाने के भी बाहरी वर्ग से, आप एक स्थानीय या अनाम वर्ग के साथ एक कारखाने का उपयोग कर सकते करना चाहते हैं:

interface Nested { 
    Object getFoo(); 
} 

static Nested newNested(Object foo) { 
    // NestedImpl has method scope, 
    // so the outer class can't refer to it by name 
    // e.g. even to cast to it 
    class NestedImpl implements Nested { 
     Object foo; 

     NestedImpl(Object foo) { 
      this.foo = foo; 
     } 

     @Override 
     public Object getFoo() { 
      return foo; 
     } 
    } 

    return new NestedImpl(foo); 
} 

एक पंडिताऊ नोट के रूप में, अपने static class Inner {} तकनीकी रूप से स्थैतिक घोंसला वर्ग है, आंतरिक वर्ग नहीं है।class Inner {} (बिना static) एक आंतरिक कक्षा होगी।

यह specifically defined इसलिए हो रहा है:

static कीवर्ड एक गैर भीतरी वर्ग या इंटरफ़ेस T के मुख्य भाग में एक सदस्य के प्रकार C की घोषणा संशोधित कर सकते हैं। इसका प्रभाव यह घोषित करना है कि C एक आंतरिक वर्ग नहीं है।

+1

अधिक पैडेंटिक रूप से, "स्थैतिक, सदस्य, वर्ग" :) नेस्टेड क्लास में स्थानीय वर्ग और एनन कक्षा की तरह अधिक शामिल है; हालांकि यह सच है कि केवल एक सदस्य वर्ग स्थिर – ZhongYu

+0

@ bayou.io हाँ हो सकता है, अगर हम विशिष्ट हैं। चूंकि स्थानीय वर्ग और अज्ञात वर्ग हमेशा आंतरिक होते हैं, इसलिए सभी स्थैतिक घोंसले वर्ग सदस्य वर्ग होते हैं। – Radiodef

+1

दिलचस्प बात यह है कि मैं समझ नहीं पा रहा हूं कि 'बार' अपूर्ण कक्षा के शरीर के भीतर है, लेकिन यह काम करता है। (और ग्रहण इसे नहीं जानता है क्योंकि यह शिकायत करता है कि निजी 'i' का उपयोग नहीं किया जाता है।)। मुझे लगता है कि "भीतर" को विभिन्न तरीकों से समझा जा सकता है :) – eckes

0

यह सब उस कोड के उस हिस्से पर निर्भर करता है जहां से आप उस ऑब्जेक्ट को एक्सेस करना चाहते हैं। चूंकि यह एक स्थाई घोंसला वर्ग है, इसलिए आप किसी भी तरीके से अपनी वस्तु तक पहुंच पाएंगे। आंतरिक कक्षाओं की बेहतर समझ के लिए इस लिंक को http://www.javatpoint.com/static-nested-class देखें।

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