2017-08-20 21 views
8

जावा 8 से स्थिर तरीके क्यों समर्थित हैं? नीचे कोड में मुख्य विधि में दो लाइनों के बीच क्या अंतर है?जावा 8 से इंटरफ़ेस में एक स्थिर विधि का उद्देश्य क्या है?

package sample; 
public class A { 
    public static void doSomething() 
    { 
     System.out.println("Make A do something!"); 
    } 
} 

public interface I { 
    public static void doSomething() 
    { 
     System.out.println("Make I do something!"); 
    } 
} 

public class B { 
    public static void main(String[] args) { 
     A.doSomething(); //difference between this 
     I.doSomething(); //and this 
    } 
} 

हम ऊपर देख सकते हैं, मैं भी बी में लागू नहीं है क्या उद्देश्य यह है जब हम एक और कक्षा में एक ही स्थिर विधि लिख सकते हैं और यह कॉल कर सकते हैं एक अंतरफलक में एक स्थिर विधि के लिए काम करेगा? क्या यह मॉड्यूलरिटी की तुलना में किसी अन्य उद्देश्य के लिए पेश किया गया था। और मॉड्यूलरिटी द्वारा, मेरा मतलब है:

public interface Singable { 
    public void sing(); 
    public static String getDefaultScale() 
    { 
     return "A minor"; 
    } 
} 

बस एक साथ तरीकों को रखने के लिए।

+3

इसे समझाना चाहिए: https://docs.oracle.com/javase/tutorial/java/IandI/defaultmethods.html – Marvin

+1

कोई फर्क नहीं पड़ता। – Professor901

+1

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

उत्तर

8

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

उन वर्गों के नाम के अलावा अन्य में कुछ भी नहीं होगा और इसके अतिरिक्त, यूटिल क्लास को final बनाने की आवश्यकता होगी और अवांछित उपयोग को रोकने के लिए एक निजी निर्माता होगा।

अब, इंटरफ़ेस स्थिर विधियों के लिए धन्यवाद, आप बिना किसी अतिरिक्त कक्षा के एक ही स्थान पर सब कुछ रख सकते हैं।

यह भी महत्वपूर्ण है कि सभी अच्छी प्रथाओं भूल नहीं करने के लिए और एक इंटरफ़ेस वर्ग को आंख मूंदकर सब कुछ फेंक नहीं - के रूप में this answer

+1

@GrzegorzPiwowarek 'संग्राहक ',' स्ट्रीमस्पोर्ट ',' स्प्लिटरेटर्स 'बिल्कुल अनावश्यक कक्षाएं नहीं हैं; एक इंटरफ़ेस के अंदर * बहुत अधिक * कोड के लिए एक रेखा होनी चाहिए। – Eugene

+1

@ यूजीन निश्चित रूप से, हमेशा कुछ अपवाद होंगे और यह एक बहुत अच्छा उदाहरण है। इसे सब एक वर्ग में डालकर एक अमानवीय गड़बड़ी होगी –

5

में बताया वहाँ मुख्य रूप से इंटरफेस के अंदर स्थिर विधि के लिए दो कारण हैं: उन इंटरफेस की create instances (और कोड स्पष्ट रूप से है जहां यह होना चाहिए); जैसे Stream.of या Stream.generate, आदि। और दूसरा कारण utility methods होगा जो उन सभी प्रकार के सामान्य हैं।

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

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