Computer >> कंप्यूटर ट्यूटोरियल >  >> प्रोग्रामिंग >> Java

क्या Java में बिना नाम की क्लास बनाना संभव है?


हां, हम एनोनिमस क्लास (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)

List list = 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 में फंक्शनल इंटरफेस के लिए लैम्ब्डा एक्सप्रेशंस को प्राथमिकता दें।

  1. - Java में इंटरफेस (Interface)

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

  1. - Java में Abstract Class

    अपनी घोषणा में abstract कीवर्ड वाली क्लास को abstract क्लास के रूप में जाना जाता है।Abstract क्लासेज में abstract मेथड्स हो भी सकते हैं और नहीं भी, यानी बिना बॉडी वाले मेथड्स (public void get();)लेकिन, यदि एक क्लास में कम से कम एक abstract मेथड है, तो क्लास को abstract घोषित किया जाना चाहिए।यदि एक क

  1. - Java में Final Class

    क्लास को final घोषित करने का मुख्य उद्देश्य क्लास को सबक्लास होने से रोकना है। यदि एक क्लास को final के रूप में चिह्नित किया जाता है तो कोई भी क्लास final क्लास से किसी भी सुविधा को इनहेरिट नहीं कर सकती।public final class Test { // body of class }