- एक इंटरफेस एक अनुबंध (contract) है जो बताता है कि क्लास क्या कर सकती है।
- जब कोई क्लास इंटरफेस को इम्प्लीमेंट करती है, तो यह इंटरफेस में घोषित सभी एब्स्ट्रैक्ट मेथड्स का कार्यान्वयन प्रदान कर सकती है। एक इंटरफेस सामान्य व्यवहारों (common behaviors) का एक सेट परिभाषित करता है। इंटरफेस को इम्प्लीमेंट करने वाली क्लासेज इन व्यवहारों से सहमत होती हैं और व्यवहारों के लिए अपना कार्यान्वयन प्रदान करती हैं।
- इंटरफेस के मुख्य उपयोगों में से एक दो ऑब्जेक्ट्स के बीच संचार अनुबंध (communication contract) प्रदान करना है।
- यदि हम जानते हैं कि कोई क्लास एक इंटरफेस को इम्प्लीमेंट करती है, तो हम जानते हैं कि उस क्लास में उस इंटरफेस में घोषित मेथड्स के ठोस कार्यान्वयन (concrete implementations) हैं और हम इन मेथड्स को सुरक्षित रूप से इनवोक करने की गारंटी रखते हैं। दूसरे शब्दों में, दो ऑब्जेक्ट्स अपने विशिष्ट कार्यान्वयन के बजाय इंटरफेस में परिभाषित अनुबंध के आधार पर संचार कर सकते हैं।
- Java मल्टीपल इनहेरिटेंस (multiple inheritance) को सपोर्ट नहीं करता। मल्टीपल इनहेरिटेंस हमें एक से अधिक डायरेक्ट सुपरक्लास से सबक्लास प्राप्त करने की अनुमति देता है। यह समस्या पैदा करता है यदि दो डायरेक्ट सुपरक्लास में विरोधाभासी कार्यान्वयन हों। Java इसे एक से अधिक इंटरफेस इम्प्लीमेंट करने की अनुमति देकर हल करता है।
- चूंकि इंटरफेस में केवल एब्स्ट्रैक्ट मेथड्स होते हैं (वास्तविक कार्यान्वयन के बिना), मल्टीपल इंटरफेस के बीच कोई विरोध उत्पन्न नहीं हो सकता।
इंटरफेस के प्रमुख उद्देश्य
1. अनुबंध परिभाषित करना (Define Contract)
इंटरफेस "क्या" (WHAT) परिभाषित करता है, "कैसे" (HOW) नहीं। यह API डिजाइन का मूल सिद्धांत है।
2. मल्टीपल इम्प्लीमेंटेशन सक्षम करना (Multiple Implementations)
interface PaymentProcessor {
void processPayment(double amount);
}
class CreditCardProcessor implements PaymentProcessor { ... }
class PayPalProcessor implements PaymentProcessor { ... }
class UPIProcessor implements PaymentProcessor { ... }
3. लूज कपलिंग (Loose Coupling)
// खराब: टाइट कपलिंग
class OrderService {
private CreditCardProcessor processor = new CreditCardProcessor(); // कंक्रीट क्लास पर निर्भर
}
// अच्छा: लूज कपलिंग
class OrderService {
private PaymentProcessor processor; // इंटरफेस पर निर्भर
public OrderService(PaymentProcessor processor) {
this.processor = processor; // डिपेंडेंसी इंजेक्शन
}
}
4. मल्टीपल इम्प्लीमेंटेशन (Multiple Implementation) - Java का मल्टीपल इनहेरिटेंस विकल्प
interface Flyable { void fly(); }
interface Swimmable { void swim(); }
class Duck implements Flyable, Swimmable { // एक से अधिक इंटरफेस
public void fly() { ... }
public void swim() { ... }
}
5. पॉलीमॉर्फिज्म और एक्सटेंसिबिलिटी
- नए कार्यान्वयन मौजूदा कोड को बदले बिना जोड़े जा सकते हैं (Open/Closed Principle)।
- टेस्टिंग के लिए मॉक इम्प्लीमेंटेशन आसानी से बनाए जा सकते हैं।
इंटरफेस vs एब्स्ट्रैक्ट क्लास
| विशेषता | इंटरफेस | एब्स्ट्रैक्ट क्लास |
|---|---|---|
| मल्टीपल इम्प्लीमेंटेशन | हां (implements) | नहीं (extends केवल एक) |
| स्टेट (फील्ड्स) | केवल static final कॉन्स्टेंट्स | इंस्टेंस वेरिएबल्स हो सकते हैं |
| कंस्ट्रक्टर | नहीं | हां |
| एक्सेस मॉडिफायर | सभी मेथड्स public (डिफ़ॉल्ट) | कोई भी |
| उद्देश्य | क्षमता/अनुबंध परिभाषित करना | आम कोड/स्टेट साझा करना |
आधुनिक Java (8+) में इंटरफेस
- डिफ़ॉल्ट मेथड्स: कार्यान्वयन के साथ मेथड्स (बैकवर्ड कम्पैटिबिलिटी के लिए)।
- स्टेटिक मेथड्स: यूटिलिटी मेथड्स इंटरफेस में।
- प्राइवेट मेथड्स (Java 9+): डिफ़ॉल्ट/स्टेटिक मेथड्स के लिए हेल्पर मेथड्स।
निष्कर्ष: इंटरफेस Java में अब्स्ट्रैक्शन, पॉलीमॉर्फिज्म, लूज कपलिंग और मल्टीपल इम्प्लीमेंटेशन को सक्षम करने का प्राथमिक तंत्र है। वे "क्लास क्या करती है" बनाम "क्लास कैसे करती है" को अलग करते हैं।