एक जावा इंटरफ़ेस में तरीकों को सार्वजनिक एक्सेस संशोधक के साथ या बिना घोषित किया जाना चाहिए?


292

जावा इंटरफ़ेस में तरीकों को publicएक्सेस संशोधक के साथ या उसके बिना घोषित किया जाना चाहिए ?

तकनीकी रूप से यह कोई फर्क नहीं पड़ता, बेशक। एक वर्ग विधि जो interfaceहमेशा लागू होती है public। लेकिन एक बेहतर सम्मेलन क्या है?

जावा स्वयं इसमें सुसंगत नहीं है। उदाहरण के लिए देखें Collectionबनाम Comparable, या Futureबनाम ScriptEngine


22
यह बुरा है क्योंकि इसे सार्वजनिक रूप से लिखने का अर्थ है कि यह गैर-सार्वजनिक हो सकता है
Pacerier

8
आपको किसी भी रूप के अनावश्यक वाक्य रचना से बचना चाहिए।
लोर्ने का अंक

3
@Pacerier, जबकि मैं मानता हूँ कि इसका इस्तेमाल करने के बुरा है publicइस संदर्भ में, डिफ़ॉल्ट इंटरफ़ेस तरीकों कर सकते हैं अब (जावा 9) के साथ निजी हो। मेरा सुझाव है कि अप्रचलित के रूप में आप अपनी टिप्पणी को हटा दें।
एरियोबे

2
हां, चीजें जावा 9 में परिवर्तन के अधीन हैं। "इसे सार्वजनिक रूप से लिखने का अर्थ है कि यह गैर-सार्वजनिक हो सकता है" । के बाद से वास्तव में है कि जावा 9 में संभव हो रहा है, इस तर्क वास्तव में लिखने के लाभ में है public
एमसी सम्राट

जवाबों:


334

JLS इस स्पष्ट करता है:

इसे अनुमति दी गई है, लेकिन एक इंटरफ़ेस में घोषित विधि के लिए publicऔर / या abstractसंशोधन को अनावश्यक रूप से निर्दिष्ट करने के लिए, शैली के रूप में हतोत्साहित किया गया है।


6
ऊपर JLS लिंक जावा 7 के लिए उस समय था जब मैंने इसे पढ़ा था। गैर-सार्वजनिक तरीकों की अनुमति देने वाले जावा 9 के बारे में टिप्पणियों के बाद, मैं बस यह पुष्टि करना चाहता था कि एसई 9 जेएलएस के लिए बहुत ही समान शब्द अभी भी है । ( publicभाग एक ही है, and/or abstractभाग गिरा दिया गया है)
ओजगुर



44

सार्वजनिक संशोधक को जावा इंटरफेस (मेरी राय में) में छोड़ा जाना चाहिए।

चूंकि यह कोई अतिरिक्त जानकारी नहीं जोड़ता है, यह सिर्फ महत्वपूर्ण सामान से ध्यान खींचता है।

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

public interface Foo{
  public void MakeFoo();
  void PerformBar();
}

3
क्या आपके पास ऐसे स्टाइल-गाइड का लिंक है?
बेनो रिचर्स 10

9
संगति अब तक की सबसे महत्वपूर्ण बात है, और इस प्रकार के 99% प्रश्नों का उत्तर है।
SCdF

सहमत पुन: संगति। आपके कोडिंग मानकों के दस्तावेज़ों के लिए कुछ लोग :)
JeeBee

2
बानो: एक उदाहरण जावा लैंग्वेज स्पेसिफिकेशन है, दूसरा चेकस्टाइल है।
रासमस फेबर

9

इस तथ्य के बावजूद कि यह प्रश्न बहुत पहले पूछा गया है, लेकिन मुझे लगता है कि एक व्यापक विवरण स्पष्ट करेगा कि इंटरफ़ेस के स्थिरांक से पहले विधियों और सार्वजनिक स्थैतिक फाइनल से पहले सार्वजनिक सार का उपयोग करने की कोई आवश्यकता क्यों नहीं है।

सबसे पहले इंटरफेसेस का उपयोग असंबद्ध वर्गों के एक सेट के लिए सामान्य तरीकों को निर्दिष्ट करने के लिए किया जाता है, जिसके लिए हर वर्ग का एक अनूठा कार्यान्वयन होगा। इसलिए निजी के रूप में एक्सेस मॉडिफायर को निर्दिष्ट करना संभव नहीं है क्योंकि इसे अन्य वर्गों द्वारा ओवरराइड किया जा सकता है।

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

तीसरा, एक इंटरफ़ेस में उदाहरण चर और विधियों सहित कोई डेटा कार्यान्वयन नहीं है। यदि किसी इंटरफ़ेस में कार्यान्वित विधियों या उदाहरण चर को सम्मिलित करने का तार्किक कारण है, तो यह एक वंशानुक्रम पदानुक्रम में एक सुपरक्लास होना चाहिए और इंटरफ़ेस नहीं होना चाहिए। इस तथ्य को ध्यान में रखते हुए, चूंकि किसी भी विधि को एक इंटरफ़ेस में लागू नहीं किया जा सकता है, इसलिए इंटरफ़ेस में सभी विधियों का सार होना चाहिए।

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

इसलिए निष्कर्ष में हालांकि इंटरफ़ेस के स्थिरांक से पहले तरीकों और सार्वजनिक स्थिर फाइनल से पहले सार्वजनिक अमूर्त का उपयोग करना वैध है लेकिन चूंकि कोई अन्य विकल्प नहीं है, इसलिए इसे अनावश्यक माना जाता है और इसका उपयोग नहीं किया जाता है।


7

की शुरूआत के साथ private, static, defaultजावा 8/9 में इंटरफ़ेस तरीकों के लिए संशोधक, बातें अधिक जटिल हो और मुझे लगता है कि करने के लिए है कि पूरा घोषणाओं अधिक पठनीय (जरूरत जावा 9 संकलित करने के लिए कर रहे हैं) करते हैं:

public interface MyInterface {

    //minimal
    int CONST00 = 0;
    void method00();
    static void method01() {}
    default void method02() {}
    private static void method03() {}
    private void method04() {}

    //full
    public static final int CONST10 = 0;
    public abstract void method10();
    public static void method11() {}
    public default void method12() {}
    private static void method13() {}
    private void method14() {}

}

5

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

सबसे खराब मैंने देखा कि घोषित तरीकों के साथ एक इंटरफ़ेस है abstract...


5

मैंने publicसंशोधक के साथ घोषणा विधियों का उपयोग किया , क्योंकि यह कोड को अधिक पठनीय बनाता है, विशेष रूप से सिंटैक्स हाइलाइटिंग के साथ। हालांकि हमारी नवीनतम परियोजना में, हमने चेकस्टाइल का उपयोग किया है जो के लिए डिफ़ॉल्ट कॉन्फ़िगरेशन के साथ एक चेतावनी दिखाता हैpublic इंटरफ़ेस विधियों पर संशोधक के , इसलिए मैंने उन्हें अलग करने के लिए स्विच किया।

इसलिए मुझे वास्तव में यकीन नहीं है कि सबसे अच्छा क्या है, लेकिन एक चीज जो मुझे वास्तव में पसंद नहीं है वह public abstractहै इंटरफ़ेस विधियों का उपयोग करना। ग्रहण कभी-कभी "एक्सट्रैक्ट इंटरफेस" के साथ रिफ्लेक्ट करते समय होता है।


2
लेकिन केवल तभी जब आप दो चेकबॉक्स की जांच करते हैं, तरीकों को सार्वजनिक, सार के रूप में घोषित करते हैं।
MetroidFan2002

4

मैं हमेशा लिखता हूं कि अगर कोई इंटरफ़ेस नहीं था तो मैं क्या उपयोग करूंगा और मैं एक प्रत्यक्ष कार्यान्वयन लिख रहा था, अर्थात, मैं उपयोग करूंगा public


6
क्या आप सभी इंटरफ़ेस विधियों को स्पष्ट रूप से घोषित करेंगे?
डैन डायर

4
यह एक इंटरफ़ेस है, एक अमूर्त वर्ग नहीं। 'सार्वजनिक' के संबंध में, यह 7 अक्षर हैं जो आपने उस समय के हिसाब से लिखे हैं, जब आप इसके बारे में सोचते हैं, बड़ी बात है! और यह है कि इसे कैसे लागू किया जाएगा, साथ ही इसे परिभाषित किया जाएगा, जो कि 1 है।
14

3

मैं इसे छोड़ना पसंद करता हूं, मैंने कहीं पढ़ा है कि डिफ़ॉल्ट रूप से इंटरफेस हैं, publicऔर abstract

मेरी पुस्तक को आश्चर्यचकित करने के लिए - हेड फर्स्ट डिज़ाइन पैटर्न , का उपयोग कर रहा हैpublic इंटरफ़ेस घोषणा और इंटरफ़ेस विधियों के साथ ... जिसने मुझे एक बार फिर से पुनर्विचार किया और मैं इस पद पर उतरा।

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


1
बस स्पष्ट करने के लिए, यदि आप publicइंटरफ़ेस घोषणा पर पहुंच संशोधक को छोड़ देते हैं तो यह डिफ़ॉल्ट रूप से सार्वजनिक और सार नहीं होगा । docs.oracle.com/javase/tutorial/java/IandI/interfaceDef.html
Jabbslad

3

मैं लोकप्रिय जवाब से असहमत हूं, कि सार्वजनिक होने का अर्थ है कि अन्य विकल्प हैं और इसलिए यह नहीं होना चाहिए। तथ्य यह है कि अब जावा 9 के साथ और उसके बाद अन्य विकल्प हैं।

मुझे लगता है कि इसके बजाय जावा को निर्दिष्ट करने के लिए 'सार्वजनिक' लागू करना चाहिए / करना चाहिए। क्यों? क्योंकि एक संशोधक की अनुपस्थिति का अर्थ है 'पैकेज' हर जगह पहुंच, और यह एक विशेष मामले के रूप में होने से भ्रम की स्थिति पैदा होती है। यदि आपने इसे स्पष्ट संदेश के साथ संकलित त्रुटि की है (उदाहरण के लिए "इंटरफ़ेस में पैकेज एक्सेस की अनुमति नहीं है।") हमें स्पष्ट अस्पष्टता से छुटकारा मिलेगा कि 'जनता' को छोड़ने का विकल्प होगा।

वर्तमान शब्दांकन पर ध्यान दें: https://docs.oracle.com/javase/specs/jls/se9/html/jls-9.html#jls-9.4

"एक इंटरफ़ेस के शरीर में एक विधि को सार्वजनिक या निजी ()6.6) घोषित किया जा सकता है । यदि कोई एक्सेस संशोधक नहीं दिया गया है, तो विधि अंतर्निहित रूप से सार्वजनिक है। इसकी अनुमति है, लेकिन सार्वजनिक रूप से निर्दिष्ट करने के लिए इसे शैली के रूप में हतोत्साहित किया जाता है। एक इंटरफ़ेस में एक विधि घोषणा के लिए संशोधक। "

देखें कि 'निजी' IS ने अभी अनुमति दी है मुझे लगता है कि अंतिम वाक्य को जेएलएस से हटा दिया जाना चाहिए था। यह दुर्भाग्यपूर्ण है कि "स्पष्ट रूप से सार्वजनिक" व्यवहार को कभी अनुमति दी गई थी क्योंकि यह अब पिछड़ी हमदर्दी के लिए बना रहेगा और इस भ्रम को जन्म देगा कि एक्सेस संशोधक की अनुपस्थिति का अर्थ है 'सार्वजनिक' इंटरफेस में और कहीं 'पैकेज'।


2

डिफ़ॉल्ट सार्वजनिक और अमूर्त द्वारा होने वाले इंटरफेस में तरीकों का कारण मुझे काफी तार्किक और स्पष्ट लगता है।

एक इंटरफ़ेस में एक विधि इसे लागू करने के लिए लागू करने के लिए मजबूर करने के लिए डिफ़ॉल्ट अमूर्त द्वारा है और डिफ़ॉल्ट रूप से सार्वजनिक है इसलिए कार्यान्वयन वर्ग के पास ऐसा करने के लिए पहुंच है।

अपने कोड में उन संशोधकों को जोड़ना निरर्थक और बेकार है और इससे केवल यह निष्कर्ष निकल सकता है कि आपके पास जावा बुनियादी बातों के ज्ञान और / या समझ का अभाव है।


लेकिन आप उन अमूर्त विधियों को भी लागू कर सकते हैं, जिनकी पहुँच सुरक्षित है - एक अमूर्त वर्ग में। इसलिए जनता की आवश्यकता नहीं है। स्पष्ट रूप से कुछ जोड़ना जो कि डिफ़ॉल्ट होगा वही है जो हमेशा निरर्थक होता है, लेकिन यह हमेशा बेकार नहीं होता है।
swpalmer

लेकिन सवाल इंटरफेस के बारे में है। मैं पचाना नहीं चाहता था। मेरा मतलब है, जावा 8 के बाद से, हम इंटरफेस में निजी और डिफ़ॉल्ट विधि के बारे में भी बात कर सकते हैं, है ना? यदि हम चाहें तो इस चर्चा को काफी लंबा किया जा सकता है। ;)
इलियाना कॉस्मिना

1

यह पूरी तरह से व्यक्तिपरक है। मैं निरर्थक publicसंशोधक को छोड़ देता हूं क्योंकि यह अव्यवस्था जैसा लगता है। जैसा कि दूसरों ने उल्लेख किया है - स्थिरता इस निर्णय की कुंजी है।

यह ध्यान रखना दिलचस्प है कि C # भाषा डिजाइनरों ने इसे लागू करने का फैसला किया। C # में सार्वजनिक रूप से इंटरफ़ेस विधि की घोषणा करना वास्तव में एक संकलन त्रुटि है। संगति शायद भाषाओं में महत्वपूर्ण नहीं है, इसलिए मुझे लगता है कि यह वास्तव में जावा के लिए सीधे प्रासंगिक नहीं है।


-9

लोग आपके आईडीई या जावदोक में कोड पूरा करने से आपके इंटरफ़ेस को सीखेंगे, स्रोत को पढ़ने से नहीं। तो स्रोत में "सार्वजनिक" डालने का कोई मतलब नहीं है - स्रोत को कोई नहीं पढ़ रहा है।


8
मुझे वास्तव में इस कथन से असहमत होना है कि स्रोत को कोई नहीं पढ़ रहा है। मुझे लगता है कि बहुत सारे लोग कोड में ज़ूम करने के लिए E3se में F3 का उपयोग करते हैं। मावेन जैसे उपकरण एक कारण से, केवल जावाडॉक ही नहीं, स्रोतों को भी डाउनलोड करने का विकल्प देते हैं।
बेनो रिचर्स

publicइंटरफ़ेस में एक्सेस मॉडिफायर नहीं जोड़ने का सटीक कारण यह नहीं है। यह डिजाइन द्वारा और इसके पीछे एक सावधान सोच के बाद है।
mtk
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.