हां, हम एनोनिमस क्लास (Anonymous Class) का उपयोग करके बिना नाम की क्लास बना सकते हैं।
एनोनिमस क्लास एक इनर क्लास है जिसका कोई नाम नहीं होता और जिसका इंस्टेंस क्लास के निर्माण के समय ही बनाया जाता है। ये क्लासेस अपने निर्माण में सामान्य क्लासेस से कुछ अलग होती हैं।
उदाहरण
public class Anonymous {
public void show() {}
public static void main(String args[]) {
Anonymous a = new Anonymous() {
@Override
public void show() {
System.out.println("Anonymous Class");
}
};
a.show();
}
}
आउटपुट
Anonymous Class
एनोनिमस क्लास की विशेषताएं
- कोई नाम नहीं: क्लास का कोई नाम नहीं होता।
- तत्काल इंस्टेंशिएशन: परिभाषा और इंस्टेंशिएशन एक ही एक्सप्रेशन में।
- सिंगल उपयोग: आमतौर पर एक ही स्थान पर उपयोग के लिए।
- सुपरक्लास/इंटरफेस आवश्यक: किसी क्लास को एक्सटेंड या इंटरफेस को इम्प्लीमेंट करना चाहिए।
- कंस्ट्रक्टर नहीं: नाम नहीं होने के कारण कंस्ट्रक्टर नहीं हो सकता (लेकिन इंस्टेंस इनिशियलाइजर ब्लॉक उपयोग कर सकते हैं)।
- फाइनल/इफेक्टिवली-फाइनल वेरिएबल्स: एनक्लोजिंग स्कोप के केवल फाइनल या इफेक्टिवली-फाइनल लोकल वेरिएबल्स एक्सेस कर सकते हैं।
दो रूप (Two Forms)
1. क्लास एक्सटेंड करना
new SuperClass() {
// मेथड्स ओवरराइड करें
@Override
public void someMethod() { ... }
};
2. इंटरफेस इम्प्लीमेंट करना
new InterfaceName() {
// सभी एब्स्ट्रैक्ट मेथड्स इम्प्लीमेंट करें
@Override
public void interfaceMethod() { ... }
};
व्यावहारिक उपयोग के मामले
1. इवेंट हैंडलर्स (GUI)
button.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
System.out.println("Button clicked!");
}
});
2. थ्रेड निर्माण (पुराना तरीका)
new Thread(new Runnable() {
@Override
public void run() {
System.out.println("Running in new thread");
}
}).start();
3. कलेक्शन सॉर्टिंग (Comparator)
Listlist = Arrays.asList("banana", "apple", "cherry"); Collections.sort(list, new Comparator () { @Override public int compare(String a, String b) { return b.compareTo(a); // डिसेंडिंग क्रम } });
Java 8+ : लैम्ब्डा एक्सप्रेशंस (बेहतर विकल्प)
फंक्शनल इंटरफेस (सिंगल एब्स्ट्रैक्ट मेथड वाले इंटरफेस) के लिए, एनोनिमस क्लास के बजाय लैम्ब्डा एक्सप्रेशंस का उपयोग करें:
// पहले (एनोनिमस क्लास)
button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) { ... }
});
// अब (लैम्ब्डा) - अधिक संक्षिप्त, पठनीय
button.addActionListener(e -> System.out.println("Clicked!"));
// Comparator के साथ
list.sort((a, b) -> b.compareTo(a));
एनोनिमस क्लास vs लैम्ब्डा
| विशेषता | एनोनिमस क्लास | लैम्ब्डा एक्सप्रेशन |
|---|---|---|
| इंटरफेस प्रकार | कोई भी (एकाधिक मेथड्स) | केवल फंक्शनल इंटरफेस (1 एब्स्ट्रैक्ट मेथड) |
| वर्बोसिटी | अधिक | कम |
| this रेफरेंस | एनोनिमस क्लास इंस्टेंस | एनक्लोजिंग क्लास इंस्टेंस |
| सीरियलाइजेशन | संभव (यदि इम्प्लीमेंट करता है) | नहीं (सामान्यतः) |
| प्रदर्शन | थोड़ा धीमा (क्लास लोडिंग) | तेज़ (invokedynamic) |
निष्कर्ष: एनोनिमस क्लासेस नामहीन क्लासेस बनाने का तरीका हैं, जो मुख्य रूप से इंटरफेस के त्वरित कार्यान्वयन या क्लास एक्सटेंशन के लिए उपयोगी हैं। आधुनिक Java में फंक्शनल इंटरफेस के लिए लैम्ब्डा एक्सप्रेशंस को प्राथमिकता दें।