2011-03-10 16 views
29

क्या यह पैकेज-निजी कक्षाओं में public के रूप में विधियों को चिह्नित करने में कोई फर्क पड़ता है?पैकेज-निजी कक्षाओं में सार्वजनिक विधियां

class SomePackagePrivateClass 
{ 
    void foo();   // package private method 

    public void bar(); // public method 
} 

वहाँ foo और bar यहाँ के बीच दृश्यता में किसी भी व्यावहारिक अंतर है?

उत्तर

14

वर्ग एक और, अधिक दिखाई उपवर्ग * द्वारा बढ़ाया जा करने के लिए नहीं जा रहा है, तो फर्क सिर्फ इतना आशय की स्पष्टता है। सभी विधियों के पैकेज को निजी घोषित करने से भविष्य के पाठकों के लिए यह निर्धारित करना मुश्किल हो जाता है कि एक ही पैकेज में अन्य वर्गों द्वारा कौन सी विधियों को बुलाया जाना है।

* जो मुझे एक डिजाइन समाधान के रूप में ज्यादा समझ में नहीं आता है, लेकिन तकनीकी रूप से संभव है। वंशानुक्रम का उपयोग

+2

"सभी विधियों को निजी घोषित करना" पढ़ना चाहिए "सभी विधियों को पैकेज-प्राइवेट घोषित करना", और "संलग्न वर्ग" को "अन्य वर्ग" के रूप में घोषित करना चाहिए, लेकिन अन्यथा – Puce

+0

@Puce +1, सही है, मैंने थोड़ा प्रश्न गलत तरीके से पढ़ा है। अब तय, धन्यवाद :-) –

4

यह बहुत छोटा अंतर बनाता है, जब तक कक्षा को सार्वजनिक (या संरक्षित नेस्टेड) ​​वर्ग द्वारा विस्तारित नहीं किया जाता है।

स्थिरता के मामले में, मैं public के लिए जाना चाहूंगा। public या private के अलावा अन्य कुछ भी होने के तरीकों के लिए यह दुर्लभ होना चाहिए।

पैकेज निजी java.lang.AbstractStringBuilder कक्षा में सार्वजनिक विधियों के कई उदाहरण हैं। उदाहरण के लिए length()AbstractStringBuilder में सार्वजनिक है और सार्वजनिक कक्षा StringBuilder में सिंक्रनाइज़ेशन जोड़ने के लिए StringBuffer में ओवरराइड किया गया है)।

+0

एक निजी वर्ग मेकअप भावना का विस्तार करता है।? – Deepak

+1

एक पैकेज निजी वर्ग का विस्तार मतलब कर सकते हैं, उदाहरण के लिएजब कक्षा कुछ आंतरिक आधार प्रदान करती है जिसे पैकेज में विभिन्न कार्यान्वयन द्वारा साझा किया जाता है (कुछ ओपन सोर्स प्रोजेक्ट्स हैं जो यह कर रहे हैं)। – Thomas

+0

'सारस्ट्रिंगबिल्डर' (?) 'स्ट्रिंगबफर' और 'स्ट्रिंगबिल्डर' द्वारा बढ़ाया गया है (यह एपीआई दस्तावेज़ों में है, लेकिन यह शायद जावाडॉक में एक बग/गलतफहमी है)। –

-1

foodefault package visibility है जहां bar के रूप में है public दृश्यता

+0

लेकिन 'बार' में वास्तव में सार्वजनिक दृश्यता नहीं है क्योंकि यह उस कक्षा में है जिसमें डिफ़ॉल्ट पहुंच ("पैकेज निजी") है। –

+0

'सार्वजनिक शून्य बार' यहां इस्तेमाल किया गया संशोधक सार्वजनिक है इसलिए मुझे लगता है कि इसमें सार्वजनिक दृश्यता है। अगर मैं गलत हूं तो मुझे सही करें – Deepak

+0

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

35

उदाहरण:

A.java

package pkg1 

class A { 
    void foo(); 
    public void bar() {}; 
} 

B.java

package pkg1 

public class B extends A{ 

} 

C.java

package pkg2 

public class C { 
    public void doSomething() { 
    B b = new B(); 
    b.bar(); //ok 
    b.foo(); //won't work, since foo() is not visible outside of package 'pkg1' 

    A a = new A(); //won't work since A is not visible outside of package 'pkg1' 
    a.bar(); //won't work, since a cannot be created 
    } 
} 
8

एक अन्य मामले में जहां विधि होना चाहिए जब आप कुछ सार्वजनिक वर्ग या इंटरफ़ेस का पैकेज निजी कार्यान्वयन बना रहे हों। चूंकि आपको ओवरराइड विधियों की दृश्यता को कम करने की अनुमति नहीं है, इसलिए इन्हें सार्वजनिक होना है।

3

अच्छा ... मुझे यह संदेह भी था (यही कारण है कि मैंने इस धागे की खोज की)। यह एक अच्छा सवाल हो सकता है।

लेकिन ...

एक दूसरे सोचा के बाद, चीजों को वास्तव में सरल से हमने सोचा है।

पैकेज-निजी विधि, एक पैकेज-निजी विधि है।

बकवास लगता है? परंतु ...

एक पैकेज-निजी विधि है, भले ही अपने वर्ग विरासत में मिला है, यह अभी भी एक पैकेज-निजी तरीका है।

यह अब और अधिक समझ बनाने करता है? एक और अधिक वर्बोज़ स्पष्टीकरण के लिए:

एक पैकेज-निजी विधि है, भले ही अपने वर्ग एक अधिक दिखाई उपवर्ग द्वारा विरासत में मिली है, यह अभी भी एक पैकेज-निजी तरीका है।

यदि सबक्लास एक ही पैकेज का है, तो पैकेज-निजी विधियों को भी विरासत में मिला है, लेकिन वे अभी भी पैकेज-निजी हैं।

यदि सबक्लास अलग-अलग पैकेज का है (यहां, हमें कुछ पैकेज-निजी विधियों के साथ माता-पिता को सार्वजनिक होने की आवश्यकता है), तो पैकेज-निजी विधियां विरासत में नहीं हैं (क्योंकि वे बिल्कुल दिखाई नहीं दे रहे हैं)।

ध्यान देने योग्य एक बिंदु, जो इस संदेह का कारण हो सकता है, कि सार्वजनिक वर्ग में पैकेज-निजी विधि अपने पैकेज के बाहर भी दिखाई नहीं दे रही है।


ऊपर पैकेज-निजी विधि के बारे में बताते हैं। और सार्वजनिक विधि का मामला वही है।

एक पैकेज-निजी वर्ग एक जघन उपवर्ग द्वारा विरासत में मिली है जब (एक ही पैकेज की, इस बहुत जरूरी है), अपने सार्वजनिक तरीकों सार्वजनिक तरीके के रूप में लिए गए हैं, और इस तरह वे एक जघन कक्षा में सार्वजनिक तरीकों बन जाते हैं।

ओपी उदाहरण में, foo() और bar() के रूप में एक पैकेज-निजी कक्षा में दोनों हैं, उनके दृश्यताएं, इस पल में पैकेज-निजी तक ही सीमित हैं, जब तक आगे कोड जोड़ रहे हैं (उदाहरण के लिए विरासत)।

आशा यह स्पष्ट (और सरल) पर्याप्त है।

पीएस the Java access control table

2

हां। public पैकेज-प्राइस क्लास में विधियां उपयोगी हो सकती हैं। जावा लाइब्रेरी से चित्रकारी उदाहरण (और क्लासिक "प्रभावी जावा" से लिया गया):

क्या आपने कभी java.util.JumboEnumSet, java.util.RegularEnumSet देखा है ?? शायद नहीं, क्योंकि वे निजी हैं, और दस्तावेज़ीकरण में संदर्भित नहीं हैं।

क्या तुमने कभी उन्हें इस्तेमाल किया है ?? शायद हाँ। वे java.util.EnumSet.noneOf(...) की स्थैतिक विधि द्वारा वापस आते हैं। यद्यपि आप उन्हें स्वयं नहीं बना सकते हैं, आप इस विधि से वापस आने पर अपने सार्वजनिक तरीकों का उपयोग कर सकते हैं।

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

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

  • कोई संबंधित समस्या नहीं^_^