Java Academy · पाठ

सही Nesting Strategy चुनना

coupling, access की आवश्यकताओं और readability के आधार पर nested class के variant में से सही विकल्प चुनें।

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

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

उचित अंतर्निवेशन रणनीति चुनना

Java में अंतर्निवेशन के चार विकल्प हैं: शीर्ष-स्तरीय, स्थैतिक अंतर्निविष्ट, आंतरिक (गैर-स्थैतिक), और स्थानीय/अनाम। सही विकल्प का चयन युग्मन, पहुँच की आवश्यकताओं और पुनः उपयोग की सीमा पर निर्भर करता है।

निर्णय वृक्ष

चयन करने के लिए ये प्रश्न पूछें:

  1. क्या वर्ग का उपयोग केवल बाहरी वर्ग के अंदर होता है? → अंतर्निवेशन पर विचार करें
  2. क्या उसे बाहरी उदाहरण की आवश्यकता है? → आंतरिक वर्ग; अन्यथा → स्थैतिक अंतर्निविष्ट वर्ग
  3. क्या उसका उपयोग केवल एक विधि में होता है? → स्थानीय या अनाम वर्ग
  4. क्या वह केवल एक विधि लागू करता है? → Lambda

शीर्ष-स्तरीय वर्ग

जब किसी प्रकार का पूरे कोड-आधार में व्यापक उपयोग हो, वह डोमेन की कोई महत्वपूर्ण अवधारणा दर्शाता हो, या कई अन्य वर्गों द्वारा आयात किया जाना हो, तब शीर्ष-स्तरीय वर्ग का उपयोग करें।

// Top-level: used across many packages
public class Product {
    // ...
}

public interface Repository<T, ID> {
    Optional<T> findById(ID id);
    void save(T entity);
}

// These belong in separate .java files and are widely imported

स्थैतिक अंतर्निविष्ट वर्ग

स्थैतिक अंतर्निविष्ट वर्ग का उपयोग तब करें जब: वह वर्ग केवल बाहरी वर्ग के संदर्भ में अर्थपूर्ण हो, उसे बाहरी उदाहरण की आवश्यकता न हो, और वह बाहरी रूप से सुलभ होना चाहिए।

class Graph {
    // Edge only makes sense in the context of a Graph
    public static class Edge {
        public final int from, to, weight;
        public Edge(int from, int to, int weight) {
            this.from = from; this.to = to; this.weight = weight;
        }
    }

    private List<Edge> edges = new ArrayList<>();

    public void addEdge(int from, int to, int weight) {
        edges.add(new Edge(from, to, weight));
    }
}

आंतरिक (गैर-स्थैतिक) वर्ग

आंतरिक वर्ग का उपयोग तब करें जब: उस वर्ग का बाहरी उदाहरण से मजबूत वैचारिक संबंध हो और उसे बाहरी वर्ग के निजी सदस्यों तक पहुँच आवश्यक हो — जैसे इटरेटर या निकटता से जुड़े सहायक ऑब्जेक्ट।

class DataStore<T> {
    private final List<T> data;

    DataStore(List<T> data) { this.data = data; }

    // Must access data — inner class makes sense
    class Snapshot {
        private final List<T> copy;

        Snapshot() { this.copy = List.copyOf(data); } // accesses outer

        T get(int idx) { return copy.get(idx); }
        int size()     { return copy.size(); }
    }

    Snapshot snapshot() { return new Snapshot(); }
}

स्थानीय वर्ग

स्थानीय वर्ग का उपयोग तब करें जब: वर्ग की आवश्यकता केवल एक विधि में हो, उसमें अनेक विधियाँ या स्थिति रखने जितनी जटिलता हो, और आप उसका क्षेत्र न्यूनतम रखना चाहते हों।

static int countWords(String text, boolean caseSensitive) {
    class WordCounter {
        Map<String, Integer> counts = new HashMap<>();

        void count(String word) {
            String key = caseSensitive ? word : word.toLowerCase();
            counts.merge(key, 1, Integer::sum);
        }

        int uniqueCount() { return counts.size(); }
    }

    WordCounter wc = new WordCounter();
    for (String w : text.split("\\s+")) wc.count(w);
    return wc.uniqueCount();
}
System.out.println(countWords("the cat sat on the mat", false)); // 5

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

जब अनेक विधियों या अमूर्त वर्ग के विस्तार की आवश्यकता हो, तब अनाम वर्ग का उपयोग करें। SAM इंटरफ़ेस के लिए Lambda का उपयोग करें।

// Lambda: clean for SAM
list.sort((a, b) -> a.compareTo(b));

// Anonymous: multi-method, or extending abstract class
java.util.TimerTask task = new java.util.TimerTask() {
    @Override public void run() { System.out.println("Tick!"); }
};
// TimerTask is abstract class — can't use lambda directly

सारणी

त्वरित संदर्भ:

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

व्यावहारिक: HTTP क्लाइंट की रूपरेखा

वास्तविक HTTP क्लाइंट की रूपरेखा पर अंतर्निवेशन रणनीति लागू करना।

class HttpClient {
    // Static nested: request config has no outer reference
    public static class RequestConfig {
        public final int timeoutMs;
        public final String userAgent;
        RequestConfig(int timeout, String ua) { this.timeoutMs = timeout; this.userAgent = ua; }
    }

    // Static nested: response is standalone data carrier
    public static class Response {
        public final int statusCode;
        public final String body;
        Response(int code, String body) { this.statusCode = code; this.body = body; }
    }

    private final RequestConfig config;
    HttpClient(RequestConfig config) { this.config = config; }

    public Response get(String url) {
        // Implementation using this.config
        return new Response(200, "body");
    }
}

अत्यधिक अंतर्निवेशन से बचें

एक से अधिक स्तर तक अंतर्निवेशन करने से बचें। बहुत गहराई से अंतर्निविष्ट वर्गों को समझना और जाँचना कठिन हो जाता है। यदि वे जटिल हो जाएँ, तो उन्हें शीर्ष-स्तरीय या पैकेज-निजी वर्गों में अलग करें।

पैकेज-निजी विकल्प

अंतर्निवेशन के बजाय, किसी वर्ग को पैकेज-निजी बनाने पर विचार करें (कोई पहुँच संशोधक नहीं)। यह केवल उसी पैकेज के भीतर दिखाई देता है, लेकिन अंतर्निविष्ट वर्ग की तुलना में जाँचना और उसका रखरखाव करना आसान होता है।

// In package com.example.order:

// Package-private: visible in package, no nesting
class OrderLine {  // no 'public' modifier
    final String sku;
    final int qty;
    OrderLine(String sku, int qty) { this.sku = sku; this.qty = qty; }
}

// Public class in same package can use OrderLine freely
public class Order {
    private List<OrderLine> lines = new ArrayList<>();
    // ...
}

विकल्प के रूप में Records और Sealing

Java की आधुनिक सुविधाएँ — रिकॉर्ड और सीलबंद इंटरफ़ेस — अक्सर जटिल अंतर्निवेशन प्रतिरूपों की आवश्यकता समाप्त कर देती हैं।

// Instead of nested inner class hierarchy:
sealed interface Shape permits Circle, Rectangle, Triangle {}
record Circle(double r) implements Shape {}
record Rectangle(double w, double h) implements Shape {}
record Triangle(double b, double h) implements Shape {}

static double area(Shape s) {
    return switch (s) {
        case Circle c      -> Math.PI * c.r() * c.r();
        case Rectangle r   -> r.w() * r.h();
        case Triangle t    -> 0.5 * t.b() * t.h();
    };
}

त्वरित जाँच

स्थैतिक अंतर्निविष्ट वर्ग के बजाय आंतरिक (गैर-स्थैतिक) वर्ग सबसे अच्छा विकल्प कब होता है?

पुनरावलोकन: उचित अंतर्निवेशन रणनीति चुनना

मुख्य बातें:

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

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

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

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

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

क्या “सही Nesting Strategy चुनना” पाठ निःशुल्क है?

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

“सही Nesting Strategy चुनना” में मैं क्या सीखूँगा?

coupling, access की आवश्यकताओं और readability के आधार पर nested class के variant में से सही विकल्प चुनें। आप ब्राउज़र में सीधे चलाए जाने वाले व्यावहारिक कोड के साथ Java Academy का अभ्यास करते हैं, और पाठ पूरा करते समय 24/7 एआई ट्यूटर आपके प्रश्नों के उत्तर देता है।

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

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

“सही Nesting Strategy चुनना” पाठ पूरा करने में कितना समय लगता है?

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 पर वापस जाएँ