एक इंटरफेस व्यवहार का प्रोटोकॉल परिभाषित करता है, न कि हमें कैसे कार्यान्वित करना चाहिए। जो क्लास इंटरफेस को इम्प्लीमेंट करती है, वह उस इंटरफेस द्वारा परिभाषित प्रोटोकॉल का पालन करती है।
- इंटरफेस वेरिएबल्स static होते हैं क्योंकि Java इंटरफेस को अपने आप इंस्टेंशिएट नहीं किया जा सकता। वेरिएबल का मान एक स्टेटिक संदर्भ में असाइन किया जाना चाहिए जिसमें कोई इंस्टेंस मौजूद नहीं होता।
- final मॉडिफायर यह सुनिश्चित करता है कि इंटरफेस वेरिएबल को असाइन किया गया मान एक वास्तविक कॉन्स्टेंट है जिसे पुन: असाइन नहीं किया जा सकता। दूसरे शब्दों में, इंटरफेस केवल कॉन्स्टेंट्स घोषित कर सकते हैं, इंस्टेंस वेरिएबल्स नहीं।
टेम्पलेट
interface interfaceName {
// कितने भी final, static वेरिएबल्स
datatype variableName = value;
// कितने भी एब्स्ट्रैक्ट मेथड डिक्लेरेशन्स
returntype methodName(list of parameters or no parameters);
}
व्याख्या
क्यों static?
- इंटरफेस को इंस्टेंशिएट नहीं किया जा सकता (
new MyInterface()अवैध)। - इंस्टेंस वेरिएबल्स किसी इंस्टेंस से संबंधित होते हैं।
- चूंकि कोई इंस्टेंस नहीं हो सकता, इंस्टेंस वेरिएबल्स का कोई अर्थ नहीं है।
- इसलिए सभी फील्ड्स क्लास-लेवल (static) होने चाहिए।
क्यों final?
- इंटरफेस व्यवहार का अनुबंध परिभाषित करता है, स्टेट नहीं।
- यदि वेरिएबल्स म्यूटेबल होते, तो अलग-अलग इम्प्लीमेंटेशन उन्हें अलग-अलग मान दे सकते थे, जिससे असंगति पैदा होती।
finalसुनिश्चित करता है कि मान स्थिर (कॉन्स्टेंट) है और सभी इम्प्लीमेंटेशन्स के लिए समान है।- यह कॉन्स्टेंट इंटरफेस पैटर्न (अब निराशाजनक माना जाता है) को सक्षम करता है।
उदाहरण
interface DatabaseConfig {
// अंतर्निहित रूप से: public static final
String URL = "jdbc:mysql://localhost:3306/mydb";
String USERNAME = "admin";
int MAX_CONNECTIONS = 10;
int TIMEOUT = 5000; // मिलीसेकंड्स
}
// उपयोग
public class MyDAO implements DatabaseConfig {
public void connect() {
System.out.println("Connecting to " + URL); // DatabaseConfig.URL
// URL = "new url"; // COMPILE ERROR - final है
}
}
कंपाइलर द्वारा अंतर्निहित मॉडिफायर्स
interface MyInterface {
int VALUE = 100;
// कंपाइलर इसे इस तरह देखता है:
public static final int VALUE = 100;
}
कॉन्स्टेंट इंटरफेस पैटर्न (निराशाजनक - Anti-pattern)
// निराशाजनक - इंटरफेस को कॉन्स्टेंट होल्डर के रूप में उपयोग करना
interface Constants {
String APP_NAME = "MyApp";
int VERSION = 1;
}
// क्लास "इम्प्लीमेंट" करती है केवल कॉन्स्टेंट्स पाने के लिए
class MyClass implements Constants {
void print() {
System.out.println(APP_NAME + " v" + VERSION); // नेमस्पेस प्रदूषण
}
}
बेहतर विकल्प: फाइनल क्लास साथ में प्राइवेट कंस्ट्रक्टर
public final class Constants {
private Constants() {} // इंस्टेंशिएशन रोकें
public static final String APP_NAME = "MyApp";
public static final int VERSION = 1;
}
// उपयोग: Constants.APP_NAME
Java 8+ : इंटरफेस में स्टेटिक मेथड्स
interface MathUtils {
static int add(int a, int b) {
return a + b;
}
static double PI = 3.14159; // स्टेटिक फील्ड (Java 8+ में अनुमत)
}
निष्कर्ष: इंटरफेस वेरिएबल्स public static final होते हैं क्योंकि इंटरफेस इंस्टेंशिएट नहीं किए जा सकते (इसलिए static) और वे अनुबंध/कॉन्स्टेंट्स परिभाषित करते हैं न कि परिवर्तनीय स्टेट (इसलिए final)। आधुनिक Java में कॉन्स्टेंट्स के लिए फाइनल क्लास या इंटरफेस में स्टेटिक मेथड्स/फील्ड्स का उपयोग करें।