2010-07-13 7 views
11

संभव डुप्लिकेट:
How are Java interfaces actually used?जावा इंटरफ़ेस के लिए कोई सही बिंदु है?

मैं देखने का एक accademic मूलमंत्र बिंदु से लेकिन देखने के एक व्यावहारिक डेवलपर बिंदु से बात नहीं कर रहा हूँ।

इसलिए उदाहरण ले रही है: -:

Client { 
    Interface intface = new Class1(); 

    intface.methodOne(); 
    intface.methodTwo(); 

    Interface intface = new Class2(); 
    intface.methodOne(); 
    intface.methodTwo(); 
} 

लेकिन अभी writting से अधिक लाभ क्या हैं: - -

Client { 
Class1 clas1 = new Class1(); 

clas1.methodOne(); 
clas1.methodTwo(); 

Class2 clas2 = new Class2(); 
clas2.methodOne(); 
clas2.methodTwo(); 
} 

और इंटरफ़ेस बाईपास

Class1 implements Interface 
public String methodOne() { 
    return "This is Class1.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class1.methodTwo()"; 
} 
    } 
Class2: 

    Class2 implements Interface 
public String methodOne() { 
    return "This is Class2.methodOne()"; 
} 

public String methodTwo() { 
    return "This is Class2.methodTwo()"; 
} 
    } 

इंटरफ़ेस का उपयोग करना कुल मिलाकर।

इंटरफेस कोड की एक अतिरिक्त परत, के लिए कोड की एक अतिरिक्त परत प्रतीत होता है या सिर्फ उन तरीकों के मुकाबले कहीं अधिक है जिनके द्वारा आप जिस कक्षा में पहुंच रहे हैं, वह यहां है?

+2

http://stackoverflow.com/questions/504904/how-are-java-interfaces-actually-used – skaffman

उत्तर

17

स्टैंडअलोन कक्षाओं का उपयोग करते समय, आपको इंटरफेस की आवश्यकता नहीं है। हालांकि, जब आपके पास टाइप पदानुक्रम है, इंटरफेस वास्तव में अनिवार्य हैं।

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

इस तरह की उपलब्धि इंटरफेस के बिना असंभव होगी। विकल्प सॉर्टिंग एल्गोरिदम को जोड़ा/निकाला जाने पर सभी स्थानों को ठीक से अपडेट करने के लिए भूल जाते समय बग को शुरू करने की अपरिहार्य संभावना के साथ, अगर संभवतः सभी जगहों पर ब्लॉक को स्विच करने की अपरिहार्य संभावना के साथ (संभवतः डुप्लीकेट) से पसंद की सॉर्ट विधि को कॉल किया जाएगा। .. उल्लेख करने के लिए नहीं है कि आप मान लीजिए आप दोनों तरीकों "Method1" और "Method2"। साथ वस्तुओं का संग्रह चाहते हैं :-(

+0

एक त्वरित उदाहरण वास्तव में उपयोगी होगा! अच्छा उत्तर! – jacoballenwood

6

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

-1

'intfaces' की एक सूची प्राप्त करने वाली निम्न विधि पर विचार करें, आपको यह पता नहीं होना चाहिए कि क्या आप clas1 या clas2 को संभालते हैं, आप बस कुछ 'इंटरफ़ेस' को संभालना चाहते हैं। आप क्लैस 3 को बाद में इंटीफेस लागू कर सकते हैं और यह काम को रोक देगा ...अगर वहाँ एक मौका आप शायद एक और प्रौद्योगिकी (विभिन्न डेटाबेस) या निरीक्षण करने के लिए एक से अधिक कार्यान्वयन की आवश्यकता होगी वह यह है कि

public void callMethods(List<intface> intfaces){ 
    for(Interface intface : intfaces) { 
     intface.methodOne(); 
     intface.methodTwo(); 
    } 
    } 
0

इंटरफेस उपयोगी होते हैं।

0

इंटरफेस, प्रकार के अनुबंध को परिभाषित अनु कार्यान्वयन विवरण के बिना। यह आपको वास्तविक कार्यान्वयन कक्षा को जानने के बिना इंटरफ़ेस के खिलाफ प्रोग्राम करने देता है।

अपने कोड का उपयोग इंटरफेस का लाभ का एक उदाहरण हो सकता है:

public void useInterface(Interface obj) { 
    obj.methodOne(); 
    obj.methodTwo(); 
} 

और के रूप में में यह बुला:

useInterface(new Class1()); 
    useInterface(new Class2()); 

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

1

अन्य लोगों काफी अपने प्रश्न कवर किया है, लेकिन, एक शब्द में: हाँ!

जावा भाषा वास्तव में काफी कम ऑब्जेक्ट उन्मुख भाषा के रूप में कल्पना की गई थी, और इंटरफेस बहुत शुरुआत से ही थे। कक्षाओं के बीच संबंधों का वर्णन करने की अवधारणाएं हैं जो बिना किसी इंटरफ़ेस या कुछ प्रदर्शन-महंगा रनटाइम प्रकार की पहचान के कठिन या असंभव हैं। मशहूर Design Patterns पुस्तक में उद्धृत सभी या लगभग सभी पैटर्न (यहां book itself है) इंटरफेस पर भरोसा करते हैं।

+0

गोफ बुक जावा के इंटरफेस के निर्माण जैसे विरासत और सार वर्गों पर स्पष्ट इंटरफेस पर भरोसा नहीं करता है। – deamon

+0

जावा में पैटर्न को लागू करते समय, आपके पास सार वर्गों की बजाय इंटरफेस का उपयोग करने के अलावा कोई विकल्प नहीं है, क्योंकि आप कई कक्षाओं से प्राप्त नहीं कर सकते हैं। –

1

(सुनिश्चित नहीं हैं कि मैं बिना यह एक जवाब के रूप में देखा जा रहा प्रतिक्रिया लेकिन ...)

वाह, इतने सारे जवाब इतनी जल्दी, बहुत प्रभावशाली मंच - चियर्स! :- डी

तो क्या यह कहना उचित होगा कि एक इंटरफ़ेस अनिवार्य रूप से 'नियम' सेट करता है जिसके लिए ठोस कक्षाएं मिलनी चाहिए?

उदाहरण के लिए यदि मेरे पास कक्षा 1 & कक्षा 2 कक्षाएं थीं, जिनमें से दोनों में 'getList()' विधि है। इंटरफेस क्लास 1 को लागू किए बिना .getList() स्ट्रिंग्स और क्लास 2 की सूची कह सकता है .getList() इंटीग्रर्स लौटा सकता है।

मूलतः इंटरफ़ेस नियम मेरी कक्षा getList (की एक विधि है नहीं है) करता है और उस विधि सूची लौटना चाहिए, इसलिए यदि दोनों विधि के साथ इंटरफेस लिस्टर को लागू 'सार्वजनिक स्ट्रिंग getList();' मुझे पता है कि कक्षा 1 & कक्षा 2 getList() प्रकार स्ट्रिंग की सूची देता है।

लेकिन ठोस वर्ग 1 विभागों की एक सूची लौटा सकता है जबकि कक्षा 2 कर्मचारियों की एक सूची है, लेकिन मुझे पता है कि वे दोनों स्ट्रिंग्स की एक सूची लौटाते हैं।

यह संभवतः अधिक उपयोगी हो जाएगा यदि मेरे पास आधे दर्जन या उससे अधिक कक्षाएं आधा दर्जन विधियों के साथ हों, जिनमें से सभी मैं सुनिश्चित करना चाहता हूं .getList प्रकार स्ट्रिंग 'नियम' की एक सूची देता है।

+1

उत्तर देने के बिना प्रतिक्रिया देने के लिए, आप एक टिप्पणी लिख सकते हैं;) "एक इंटरफेस के लिए कार्यान्वयन एक कार्यान्वयन नहीं है।" यह सुनिश्चित करते हुए कि आपके ऐप के आधार पर आपका ऐप, या अन्य ऐप्स यह सुनिश्चित करते समय कार्यान्वयन को बदलने की अनुमति मिलती है, तोड़ नहीं जाएगी। चूंकि आपके कार्यान्वयन को इंटरफेस के अनुबंध का पालन करना है। – Redlab

+0

आप अपनी प्रतिक्रिया जोड़ने या चीजों को स्पष्ट करने के लिए अपना मूल प्रश्न संपादित कर सकते हैं। – rsp

1

मैं ज्यादातर के लिए

  • एकाधिक वंशानुक्रम का अनुकरण
  • एक सेवा अनुबंध और एक सेवा कार्यान्वयन
  • एकल पद्धति कॉलबैक अनुबंध

और क्योंकि परिभाषित करने इंटरफेस का उपयोग

  • रों ome निर्भरता इंजेक्शन चौखटे इंटरफेस की आवश्यकता होती है
  • मजाक इंटरफेस मजाक कक्षाएं
  • कई AOP चौखटे कक्षाएं

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

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