2011-07-05 1 views
8

में इंटरफ़ेस को कार्यान्वित करते समय दृश्यता कम करें I कक्षा ए लागू करने वाले इंटरफ़ेस सी को डिज़ाइन करना चाहते हैं और बाहरी दुनिया से सुरक्षित बनाने के लिए किसी विधि (सी में घोषित) की दृश्यता को कम करना चाहते हैं, कक्षा में कार्यान्वित इंटरफ़ेस में से एक तरीका बनाएं एक निजी (वर्ग ए में दृश्यता को कम करना)। मुझे सुरक्षा कारण के लिए ऐसा करना है, मैं यह कैसे कर सकता हूं, क्या कोई कामकाज है। हम जानते हैं कि डिफ़ॉल्ट रूप से, इंटरफ़ेस में सार्वजनिक सदस्य होते हैं। लेकिन मेरे लिए कोई विकल्प नहीं है, क्या कोई मेरी मदद कर सकता है। अग्रिम में धन्यवाद।जावा

- तो, इंटरफ़ेस से क्लास कार्यान्वयन विधि रखने और इसे निजी बनाने का कोई तरीका नहीं है। और किसी भी इंटरफ़ेस की विधि को लागू करने वाले सभी वर्गों में हमेशा सार्वजनिक विधियां होंगी?

उत्तर

13

नहीं, आप इंटरफ़ेस में किसी विधि की दृश्यता को कम नहीं कर सकते हैं। यदि कोई लिखा है तो आप क्या करेंगे:

C foo = new A(); 
foo.methodDeclaredPrivateInA(); 

? जहां तक ​​कंपाइलर का संबंध है, C के कार्यान्वयन के संदर्भ में सबकुछ इसके भीतर किसी भी तरीके से कॉल करने का अधिकार है - यही वह है जो लिस्कोव का प्रतिस्थापन सिद्धांत है।

यदि आप पूरे सार्वजनिक इंटरफ़ेस को कार्यान्वित नहीं करना चाहते हैं, तो इसे लागू न करें - या अगर आपको बिल्कुल जरूरी है तो अपवाद फेंक दें।

यह भी ध्यान देने योग्य है कि स्रोत कोड में प्रदान की गई पहुंच शायद ही कभी अच्छी है सुरक्षा माप। यदि आपकी कक्षा एक वीएम में चल रही है जो बदले में अपनी अनुमतियों को निर्धारित करती है, तो कोई भी प्रतिबिंब के माध्यम से सदस्यों को दृश्यमान बना सकता है।

+0

तो, इंटरफ़ेस से क्लास कार्यान्वयन विधि रखने और इसे निजी बनाने का कोई तरीका नहीं है। और किसी भी इंटरफ़ेस की विधि को लागू करने वाले सभी वर्गों में हमेशा सार्वजनिक विधियां होंगी? –

+0

@ उपयोगकर्ता 357349: हां। इस तरह से डिजाइन किया गया है। –

2

आप जावा में किसी इंटरफ़ेस की विधि की दृश्यता को कम नहीं कर सकते हैं। क्या java.lang.UnsupportedOperationException फेंककर विधि को कार्यान्वित करना आपके लिए स्वीकार्य है?

0

आप दृश्यता कम नहीं कर सकते क्योंकि आप

C newC = new A(); 
0

की तर्ज यह दृष्टिकोण मेरे लिए काम किया साथ कुछ लिख सकते हैं। PrivateInterface में जोड़ा गया कोई भी नया फ़ंक्शन अभी भी तोड़ देगा PublicSampleClass

private interface PrivateInterface { 
    void fooBar(); 
} 

public class PublicSampleClass { 

    private final listenerInterface = new PrivateInterface { 
     public void fooBar() { 
      PublicSampleClass.this.fooBar(); 
     } 
    }; 

    protected void fooBar() { 
     // Non public implementation 
    } 

}