2011-03-29 14 views
6

का उपयोग क्यों करें पैकेज दृश्यता (डिफ़ॉल्ट), जब तक कि कक्षा जावा में सार्वजनिक किया जाना चाहिएपैकेज दृश्यता

+1

कुछ पृष्ठभूमि पढ़ना मदद करेगा, उदाहरण के लिए [जावा में सोच] [http://www.mindview.net/Books/TIJ/) अध्याय 5. यह सब पहले लिखा गया है। –

+1

इंटरफेस के लिए, डिफ़ॉल्ट दृश्यता सार्वजनिक है। ;) –

उत्तर

0

क्या आप किसी भी पहुँच संशोधक (यानी, सार्वजनिक निजी या सुरक्षित) के बिना, default संशोधक यानी द्वारा मिलता है, इसका मतलब है कि यह किसी विशेष पैकेज के भीतर सभी के लिए दृश्यमान है। इसलिए, जब आप अपनी कक्षा को केवल अपने पैकेज में पहुंचाना चाहते हैं, तो आपको default एक के लिए जाना चाहिए।

और अधिक पढ़ें: Controlling Access

3

मेरे understaning, अर्थात वर्गों है कि पैकेज इंटरफ़ेस, अर्थात वर्गों है कि पैकेज के बाहर नहीं किया जाना चाहिए फार्म नहीं है पैकेज/डिफ़ॉल्ट पहुँच पैकेज internals के लिए है।

7

रोस्टिस्लाव मैटल ने कहा, यह तब उपयोगी होता है जब आप ऐसा कुछ करना चाहते हैं जो आपके पैकेज के इंटरफ़ेस का हिस्सा न बनें।

उदाहरण के तौर पर, कल्पना करें कि आपके पास एक पैकेज है और यह एक इंटरफ़ेस प्रदान करता है और सेवा के कम से कम एक ठोस कार्यान्वयन प्रदान करता है।

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

मुझे लगता है कि मैं नियमित रूप से पैकेज निजी सहायक वर्ग बनाते हैं जिसमें उपयोगिता प्रकार के तरीके होते हैं या हमें आवश्यक मैपिंग जैसे कार्यों को निष्पादित करते हैं। डिफ़ॉल्ट (पैकेज निजी) दृश्यता इसके लिए बिल्कुल सही है क्योंकि आपके पैकेज के अंदर अन्य कक्षाएं इन सहायकों का उपयोग कर सकती हैं लेकिन पैकेज के बाहर कोई भी उन्हें देख सकता है ताकि जब भी आप चाहें उन्हें बदल सकें।

यह एक एक उदाहरण कुछ कोड का उपयोग कर रहा है:

हम अपने इंटरफेस है:

public interface UsefulService { 
    Collection<DataThings> getThings(Identifier id); 
} 

... और हमारे ठोस कार्यान्वयन:

public class JdbcUsefulServiceImpl implements UsefulService { 

    //We can break the code for the mapping out into its own class 
    private Mapper mapper; 

    @Override 
    public Collection<DataThings> getThings(Identifier id){ 
     DatabaseQueryResult queryResult = //Code to hit a database and return objects from that domain model 
     Collection<DataThings> result = mapper.mapFromDatabaseToServiceDomain(queryResult); 
     return result; 
    } 
} 

तो हम हमारे नक्शाकार है। हम देखभाल करने के लिए सेवा आंतरिक रूप से काम करता है के बारे में तो हम पैकेज निजी दृश्यता का उपयोग पैकेज के बाहर किसी की जरूरत नहीं है और हम के रूप में कई वर्गों हो सकता है के रूप में हम काम किया प्राप्त करना चाहते हैं:

class Mapper { 
    Collection<DataThings> mapFromDatabaseToServiceDomain(DatabaseQueryResult queryResult){ 
     //magic to map objects goes here 
    } 
} 

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

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

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