Java Academy · पाठ

Local और Anonymous Classes

methods के भीतर classes घोषित करें और interfaces के anonymous implementations तुरंत बनाएँ।

पाठ 3, कुल 4 में से13 चरण

Local और Anonymous Classes, CoddyKit पर Java Academy का एक निःशुल्क पाठ है। यह 4 में से 3वाँ पाठ है। आप नीचे पूरा पाठ निःशुल्क पढ़ सकते हैं—फिर अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर के साथ ब्राउज़र में इसका व्यावहारिक अभ्यास कर सकते हैं। यह Java Academy सीखने के मार्ग का हिस्सा है और आपकी प्रगति वेब तथा CoddyKit ऐप पर सिंक होती रहती है। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

स्थानीय और अनाम वर्ग

स्थानीय वर्ग किसी विधि के अंदर परिभाषित किए जाते हैं। अनाम वर्ग ऐसे स्थानीय वर्ग होते हैं जिनका कोई नाम नहीं होता — इनमें वर्ग की घोषणा और उसका उदाहरण बनाना एक साथ होता है। दोनों प्रभावी रूप से अंतिम स्थानीय चरों को अपने साथ संचित कर सकते हैं।

स्थानीय वर्ग की घोषणा

स्थानीय वर्ग की घोषणा किसी विधि के मुख्य भाग के अंदर की जाती है। यह समाविष्ट करने वाले वर्ग के सदस्यों और प्रभावी रूप से अंतिम स्थानीय चरों तक पहुँच सकता है।

static void greet(String language) {
    // Local class — defined inside the method
    class Greeter {
        String sayHello(String name) {
            // Can access 'language' — it is effectively final
            return switch (language) {
                case "EN" -> "Hello, " + name;
                case "ES" -> "Hola, " + name;
                case "FR" -> "Bonjour, " + name;
                default   -> "Hi, " + name;
            };
        }
    }

    Greeter g = new Greeter();
    System.out.println(g.sayHello("Alice"));
}
greet("ES"); // Hola, Alice

प्रभावी रूप से अंतिम चर

स्थानीय और अनाम वर्ग केवल ऐसे स्थानीय चरों को अपने साथ संचित कर सकते हैं जो प्रभावी रूप से अंतिम हों — आरंभीकरण के बाद उन्हें कभी नया मान नहीं दिया जाता।

void process(int threshold) {
    // threshold is effectively final (never reassigned)
    Runnable r = new Runnable() {
        public void run() {
            System.out.println("Threshold: " + threshold);
        }
    };
    r.run();

    // threshold = 10; // If you add this, the anonymous class won't compile
}

अनाम वर्ग की मूल बातें

अनाम वर्ग किसी इंटरफ़ेस को लागू करता है या किसी वर्ग का विस्तार सीधे उसी स्थान पर, एक ही अभिव्यक्ति में करता है।

interface Comparator<T> {
    int compare(T a, T b);
}

// Anonymous class implementing Comparator
java.util.Comparator<String> byLength = new java.util.Comparator<String>() {
    @Override
    public int compare(String a, String b) {
        return Integer.compare(a.length(), b.length());
    }
};

List<String> words = new ArrayList<>(List.of("banana", "fig", "apple", "kiwi"));
words.sort(byLength);
System.out.println(words); // [fig, kiwi, apple, banana]

अनाम वर्ग बनाम Lambda

एकल-अमूर्त-विधि (SAM) इंटरफ़ेस के लिए लैम्ब्डा अभिव्यक्तियाँ अनाम वर्गों का स्थान लेती हैं। फिर भी, अनेक विधियों वाले इंटरफ़ेस या अमूर्त वर्ग का विस्तार करने के लिए अनाम वर्ग आवश्यक होते हैं।

// Anonymous class for single-method interface
Runnable r1 = new Runnable() {
    public void run() { System.out.println("Running!"); }
};

// Lambda — cleaner for SAM interfaces
Runnable r2 = () -> System.out.println("Running!");

// Must use anonymous class for multi-method interface:
java.io.FilenameFilter filter = new java.io.FilenameFilter() {
    public boolean accept(java.io.File dir, String name) {
        return name.endsWith(".java");
    }
}; // FilenameFilter is not a SAM — no lambda shorthand

स्थिति वाला अनाम वर्ग

लैम्ब्डा अभिव्यक्तियों के विपरीत, अनाम वर्गों में फ़ील्ड हो सकते हैं। यह तब उपयोगी है जब आपको अनाम कार्यान्वयन के भीतर स्थिति बनाए रखनी हो।

interface Counter { int increment(); int get(); }

Counter counter = new Counter() {
    private int count = 0;

    public int increment() { return ++count; }
    public int get()       { return count; }
};

System.out.println(counter.increment()); // 1
System.out.println(counter.increment()); // 2
System.out.println(counter.get());       // 2

अनाम श्रोता प्रतिरूप

लैम्ब्डा अभिव्यक्तियों से पहले, GUI और Android प्रोग्रामिंग में घटना श्रोताओं के लिए अनाम वर्ग मानक प्रतिरूप थे।

// Modern Android/Swing style: anonymous class listener
Button loginButton = new Button(); // hypothetical
loginButton.setOnClickListener(new OnClickListener() {
    @Override
    public void onClick() {
        System.out.println("Login button clicked!");
    }
});

// Modern equivalent with lambda (if OnClickListener is SAM):
loginButton.setOnClickListener(() -> System.out.println("Clicked!"));

जटिल तर्क के लिए स्थानीय वर्ग

स्थानीय वर्ग तब अच्छी तरह काम करते हैं जब आपको केवल एक स्थान पर अनेक विधियों वाला वर्ग चाहिए — जो लैम्ब्डा के लिए बहुत जटिल हो, लेकिन शीर्ष-स्तरीय वर्ग के लिए बहुत विशिष्ट हो।

static List<String> processData(List<String> data, String prefix) {
    // Local class: complex enough for a class, used only here
    class DataProcessor {
        List<String> result = new ArrayList<>();

        void process(String item) {
            // prefix is effectively final
            if (item.startsWith(prefix)) {
                result.add(item.toUpperCase());
            }
        }
    }
    DataProcessor dp = new DataProcessor();
    data.forEach(dp::process);
    return dp.result;
}
System.out.println(processData(List.of("apple","avocado","banana"), "a"));
// [APPLE, AVOCADO]

अमूर्त वर्ग के लिए अनाम वर्ग

अनाम वर्ग अमूर्त वर्गों का विस्तार कर सकते हैं और नामित उपवर्ग बनाए बिना अमूर्त विधियों को अधिलेखित कर सकते हैं।

abstract class ReportFormatter {
    abstract String formatHeader(String title);
    abstract String formatBody(List<String> rows);

    String format(String title, List<String> rows) {
        return formatHeader(title) + "\n" + formatBody(rows);
    }
}

ReportFormatter csvFormatter = new ReportFormatter() {
    public String formatHeader(String t) { return "\"" + t + "\""; }
    public String formatBody(List<String> rows) {
        return String.join("\n", rows);
    }
};
System.out.println(csvFormatter.format("Sales", List.of("a,1","b,2")));

दोहरी-ब्रेस आरंभीकरण का विरोधी प्रतिरूप

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

// Anti-pattern: double-brace initialization
Map<String, Integer> map = new HashMap<String, Integer>() {{
    put("a", 1);
    put("b", 2);
}};
// Creates an anonymous HashMap subclass — wasteful!

// GOOD: use Map.of() or Map.ofEntries()
Map<String, Integer> better = Map.of("a", 1, "b", 2);

// Or a mutable map:
Map<String, Integer> mutable = new HashMap<>(Map.of("a", 1, "b", 2));

चयन: Lambda बनाम अनाम बनाम स्थानीय

निर्णय मार्गदर्शिका:

  • Lambda: एकल अमूर्त विधि, कोई अतिरिक्त स्थिति नहीं, कोई विरासत नहीं
  • अनाम वर्ग: अनेक विधियाँ, स्थिति की आवश्यकता, या अमूर्त वर्ग का विस्तार
  • स्थानीय वर्ग: विधि के भीतर पुनः उपयोग, अनेक विधियाँ या जटिल स्थिति आवश्यक हो

त्वरित जाँच

अनाम वर्ग एक ही अभिव्यक्ति में हमेशा क्या करता है?

पुनरावलोकन: स्थानीय और अनाम वर्ग

मुख्य बातें:

  • स्थानीय वर्ग विधियों के अंदर परिभाषित होते हैं और प्रभावी रूप से अंतिम स्थानीय चरों तक पहुँच सकते हैं
  • अनाम वर्ग एक ही अभिव्यक्ति में वर्ग की घोषणा और उसका उदाहरण बनाना एक साथ करते हैं
  • लैम्ब्डा अभिव्यक्तियों के विपरीत, अनाम वर्गों में फ़ील्ड और अनेक विधियाँ हो सकती हैं
  • एकल-अमूर्त-विधि वाले इंटरफ़ेस के लिए लैम्ब्डा अभिव्यक्तियाँ अनाम वर्गों का स्थान लेती हैं
  • जब तर्क किसी वर्ग के लिए पर्याप्त जटिल हो, लेकिन केवल एक विधि तक सीमित हो, तब स्थानीय वर्ग का उपयोग करें
  • दोहरी-ब्रेस आरंभीकरण से बचें — यह अनावश्यक अनाम उपवर्ग बनाता है
शुरुआत निःशुल्क

एआई शिक्षक के साथ Java सीखें — निःशुल्क

अपने ब्राउज़र में वास्तविक कोड लिखें और चलाएँ, चौबीसों घंटे एआई शिक्षक से तुरंत सहायता पाएँ, और वेब या ऐप पर वहीं से शुरू करें जहाँ आपने छोड़ा था।

पाठ्यक्रम
104
पाठ
374

अक्सर पूछे जाने वाले प्रश्न

क्या “Local और Anonymous Classes” पाठ निःशुल्क है?

हाँ—“Local और Anonymous Classes” का पूरा पाठ यहाँ वेब पर निःशुल्क पढ़ा जा सकता है। इंटरैक्टिव अभ्यास (अंतर्निहित कोड संपादक और 24/7 एआई ट्यूटर) करने और Java Academy पाठ्यक्रम का बाकी हिस्सा अनलॉक करने के लिए CoddyKit PRO लें। Java Academy पाठ्यक्रम में कुल 4 पाठ शामिल हैं।

“Local और Anonymous Classes” में मैं क्या सीखूँगा?

methods के भीतर classes घोषित करें और interfaces के anonymous implementations तुरंत बनाएँ। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

क्या Java Academy शुरू करने के लिए मुझे किसी अनुभव की आवश्यकता है?

पहले के अनुभव की आवश्यकता नहीं है। CoddyKit पर Java Academy शुरुआती से लेकर उन्नत शिक्षार्थियों तक सभी के लिए व्यवस्थित किया गया है, इसलिए आप यहीं से या शुरुआत से सीखना शुरू कर सकते हैं और अपनी गति से आगे बढ़ सकते हैं। यह 4 में से 3वाँ पाठ है।

“Local और Anonymous Classes” पाठ पूरा करने में कितना समय लगता है?

CoddyKit का अधिकांश पाठ लगभग 5–10 मिनट में पूरा हो जाता है। हर पाठ छोटा और संवादात्मक है, इसलिए आप लगातार प्रगति करते हैं और वेब या ऐप पर वहीं से सीखना जारी रख सकते हैं जहाँ आपने छोड़ा था।

क्या मैं इस Java Academy पाठ में कोड लिख और चला सकता हूँ?

हाँ। हर Java Academy पाठ में एक अंतर्निर्मित कोड संपादक शामिल है, जिससे आप सीधे अपने ब्राउज़र में वास्तविक कोड लिख और चला सकते हैं और तुरंत एआई प्रतिक्रिया पा सकते हैं—स्थानीय सेटअप की आवश्यकता नहीं है।

इस पाठ्यक्रम के सभी पाठ

  1. Static Nested Classes
  2. Inner Classes और Outer Access
  3. Local और Anonymous Classes
  4. सही Nesting Strategy चुनना
← Java Academy पर वापस जाएँ