2015-03-13 9 views
29

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

तो http://openjdk.java.net/jeps/213 के लिए विनिर्देश कहता है और बग रिपोर्ट https://bugs.openjdk.java.net/browse/JDK-8071453 में बताता है।

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

संपादित करें: तो जवाब यह है कि के कारण कैसे डिफ़ॉल्ट कार्यान्वयन जावा 8 में इंटरफेस में जोड़ा गया है, कि ऐसे मामले जहां डिफ़ॉल्ट कार्यान्वयन एक ही codebase का उपयोग कर रहे हो सकता है।

उदाहरण के लिए,

public interface MyInterface { 
    default void initializeMyClass(MyClass myClass, Params params) { 
     //do magical things in 100 lines of code to initialize myClass for example 
    } 

    default MyClass createMyClass(Params params) { 
     MyClass myClass = new MyClass(); 
     initializeMyClass(myClass, params); 
     return myClass; 
    } 

    default MyClass createMyClass() { 
     MyClass myClass = new MyClass(); 
     initializeMyClass(myClass, null); 
     return myClass; 
    } 
} 

बेवकूफ उदाहरण के लिए, मुझे पता है। लेकिन मान लें कि हम दोनों तरीकों से initializeMyClass(Params) का उपयोग करना चाहते हैं। हालांकि, अगर हम इसे इस तरह (डिफ़ॉल्ट विधि) करते हैं, तो initializeMyClass(Params) सार्वजनिक इंटरफ़ेस का हिस्सा होगा! ऐसा होने से रोकने के लिए, हम केवल createMyClass() डिफ़ॉल्ट विधियों के अंदर पूरे initializeMyClass(Params) का कोड रख सकते हैं। जिसके परिणामस्वरूप कोड डुप्लिकेशन, जो अवांछनीय है।

इसलिए, यह रिफैक्टरिंग के साथ समस्या का कारण बनता है, और ऐसे कोड डुप्लिकेशन को हटाने के लिए, निजी डिफ़ॉल्ट विधियों की अनुमति है।

उत्तर देने के लिए धन्यवाद!

+0

जावा 9 निजी इंटरफ़ेस विधियों का समर्थन करता है। – Nicolai

+0

हाँ मुझे पता है, यह सवाल "उनके बारे में क्या बात है" के बारे में था, लेकिन यह डिफ़ॉल्ट तरीकों के कारण है। – EpicPandaForce

उत्तर

26

इंटरफेस में अब default methods हो सकता है। इन्हें जोड़ा गया ताकि उन विधियों को लागू करने वाले सभी वर्गों को तोड़ने के बिना इंटरफेस में नई विधियों को जोड़ा जा सके।

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

+1

क्या ऐसी विधियां मूल रूप से सिंटैक्टिक चीनी हैं जो स्थिर विधियों को कॉल करती हैं जो अन्यथा पैकेज-निजी हो सकती हैं? – supercat

+1

नहीं, क्योंकि आप उन्हें अपने कार्यान्वयन में उदाहरण विधियों के रूप में ओवरराइड कर सकते हैं, जो कुछ ऐसा है जो आप स्थिर विधि का उपयोग करते हैं तो आप नहीं कर सकते हैं। –

+4

इस तरह के ओवरराइडिंग काम कैसे करेंगे? ओवरराइड एक्सेस क्या हो सकता है, और ओवरराइड तक क्या पहुंच सकता है? – supercat

5

क्यों बस (बस Java8 का उपयोग कर =) नहीं:

पुनश्च: क्योंकि निजी सहायक के जावा

में
public interface MyInterface { 
private static class Helper{ 
    static initializeMyClass(MyClass myClass, Params params){ 
     //do magical things in 100 lines of code to initialize myClass for example 
    } 
} 

default MyClass createMyClass(Params params) { 
    MyClass myClass = new MyClass(); 
    Helper.initializeMyClass(myClass, params); 
    return myClass; 
} 

default MyClass createMyClass() { 
    MyClass myClass = new MyClass(); 
    Helper.initializeMyClass(myClass, null); 
    return myClass; 
} 
} 
+0

अच्छी चाल, शायद क्योंकि यह थोड़ा कम सुविधाजनक है लेकिन यह एक अच्छी चाल है! – EpicPandaForce

+0

मैं "उम्र" के लिए व्यापक रूप से ऐसे सहायकों का उपयोग करता हूं। थोड़ा सा अजीब बात है कि प्रोग्रामिंग भाषा इस तरह के उद्देश्य, मेरे पीओवी से अनावश्यक जटिलता के अतिरिक्त स्तर के लिए इस तरह से बढ़ा दी गई है। –

+0

निजी स्थैतिक वर्ग मेरे ग्रहण से संकलित नहीं है –

1

जावा 9 संभव नहीं है के लिए एक निजी विधि अंतरफलक के अंदर घोषित करने की अनुमति देता है। यहां इसका उदाहरण दिया गया है।

interface myinterface { 
    default void m1(String msg){ 
     msg+=" from m1"; 
     printMessage(msg); 
    } 
    default void m2(String msg){ 
     msg+=" from m2"; 
     printMessage(msg); 
    } 
    private void printMessage(String msg){ 
     System.out.println(msg); 
    } 
} 
public class privatemethods implements myinterface { 
    public void printInterface(){ 
     m1("Hello world"); 
     m2("new world"); 
    } 
    public static void main(String[] args){ 
     privatemethods s = new privatemethods(); 
     s.printInterface(); 
    } 
} 

इसके लिए, आपको 1.9 संस्करण तक जेडीके अपडेट करना होगा।

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