2011-01-01 16 views
11

क्या निजी इंटरफेस कभी भी डिजाइन निर्णयों में उपयोग किए जाते हैं? यदि हां, तो क्या कारण हैं और आप निजी इंटरफ़ेस की आवश्यकता कब जानते हैं?डिज़ाइन निर्णय: क्यों इंटरफ़ेस निजी और क्यों बनाना है?

+0

जब इंटरफ़ेस ऐसा कुछ है जो किसी विशिष्ट पैकेज में नहीं है जो सभी कोड से दूर किया जाना चाहिए? – thejh

+3

एक इंटरफ़ेस केवल निजी हो सकता है यदि यह एक नेस्टेड इंटरफ़ेस है। एक अपूर्ण कक्षा या इंटरफ़ेस या तो सार्वजनिक या पैकेज-निजी हो सकता है। – Mot

उत्तर

3

IMHO आप उपयोगी रूप से एक इंटरफ़ेस निजी नहीं बना सकते हैं।

हालांकि मेरे पास अक्सर दो इंटरफेस होते हैं, एक सार्वजनिक उपयोग के लिए और एक आंतरिक उपयोग के लिए। आंतरिक उपयोग इंटरफ़ेस यदि संभव हो तो मैं पैकेज स्थानीय बना देता हूं उदा।

public interface MyInterface { 
    public void publicMethod(); 
} 

interface DirectMyInterface extends MyInterface { 
    public void internalUseOnlyMethod(); 
} 

आंतरिक उपयोग के तरीकों का पर्दाफाश तरीकों मैं अन्य डेवलपर्स का उपयोग नहीं करना चाहते हैं और/या मैं आसानी से बदलने में सक्षम होना चाहता हूँ। मेरे पास इंटरफ़ेस का कारण यह है कि मेरे पास कई कार्यान्वयन हैं जिन्हें मैं इंटरफ़ेस के माध्यम से आंतरिक रूप से उपयोग करना चाहता हूं।

+2

किस उद्देश्य के लिए आपको आंतरिक उपयोग-पैकेज की आवश्यकता है? जावा अनुभव के 10 से अधिक वर्षों में मैं इस पैटर्न के बारे में कभी नहीं आया - लेकिन आप कहते हैं कि आप इसका इस्तेमाल करते हैं ** अक्सर **। – Mot

+2

मैं अक्सर अन्य डेवलपर्स द्वारा उपयोग की जाने वाली पुस्तकालयों या ढांचे को लिखता हूं। मैं इंटरफेस को यथासंभव सरल रखना चाहता हूं, इसलिए किसी भी तरीके से मैं छिप सकता हूं मैं esp करता हूं। अगर वे अन्य डेवलपर्स द्वारा उपयोग करने का इरादा नहीं है। –

1

इंटरफ़ेस यदि आंतरिक उपयोग के लिए है तो इसे पैकेज संरक्षित किया जाना चाहिए। सामान्य रूप से यदि इंटरफ़ेस के पास इसकी कक्षा के बाहर कोई रूचि नहीं है तो यह एक अच्छा एपीआई डिज़ाइन निर्णय to hide it है क्योंकि इंटरफ़ेस के उपयोगकर्ताओं के लिए कम जटिलता है और आपको इसे अधिक आसानी से पुन: सक्रिय करने की अनुमति देता है, क्योंकि जब इंटरफ़ेस सार्वजनिक होता है और एपीआई आप इसे बदलने की स्वतंत्रता खो देते हैं।

4

शीर्ष-स्तरीय इंटरफ़ेस निजी नहीं हो सकता है। इसमें केवल public या पैकेज का उपयोग हो सकता है। Java Language Specification, section 9.1.1: "Interface Modifiers" से:

पहुँच संशोधक संरक्षित और निजी केवल सदस्य इंटरफेस जिसका घोषणाओं सीधे एक वर्ग घोषणा से घिरा रहे हैं से संबंधित (§8.5.1)।

एक नेस्टेड इंटरफ़ेसprivate हो सकता है जब भी यह और उसके उपवर्गों, यदि कोई हो, अपने शीर्ष स्तर के वर्ग के कार्यान्वयन विस्तार कर रहे हैं।

उदाहरण के लिए, नेस्टेड इंटरफ़ेस CLibrary नीचे शीर्ष-स्तरीय वर्ग के कार्यान्वयन विवरण के रूप में उपयोग किया जाता है। इसका उपयोग जेएनए के लिए एक एपीआई को परिभाषित करने के लिए किया जाता है, जिसे इंटरफ़ेस के Class द्वारा सूचित किया जाता है।

public class ProcessController { 
    private interface CLibrary extends Library { 
     CLibrary INSTANCE = (CLibrary) Native.loadLibrary("c", CLibrary.class); 
     int getpid(); 
    } 

    public static int getPid() { 
     return CLibrary.INSTANCE.getpid(); 
    } 
} 

एक और उदाहरण के रूप में, यह निजी इंटरफ़ेस निजी नेस्टेड कस्टम स्वरूपण प्रतीकों को लागू करने वर्गों द्वारा इस्तेमाल किया एक API परिभाषित करता है।

public class FooFormatter { 
    private interface IFormatPart { 
     /** Formats a part of Foo, or text. 
     * @param foo Non-null foo object, which may be used as input. 
     */ 
     void write(Foo foo) throws IOException; 
    } 

    private class FormatSymbol implements IFormatPart { ... } 

    private class FormatText implements IFormatPart { ... } 

    ... 
} 
+0

मुझे आपका दूसरा उदाहरण पसंद है। –

+0

@ जोर्डन स्टीवर्ट - धन्यवाद। यह कुछ असली दुनिया कोड से एक बहुत ही सरल उदाहरण है। –

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

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