Java खत्म नहीं हो रहा, बल्कि नए रूप में आ रहा है
\nहर साल कोई न कोई कहता है "Java मर चुका है"। और हर साल Java इसके उलट साबित करता है। 2025 में, लगभग 30 साल पुरानी यह भाषा कई बुनियादी अपडेट लेकर आ रही है। अगर आप Java में कोड लिखते हैं, लेकिन पिछली बार changelog एक साल पहले देखा था, तो आप पीछे रह गए हैं। आइए जानते हैं कि वास्तव में क्या बदलने वाला है और ये बदलाव आपके कोड को कैसे प्रभावित करेंगे।
\nमैं आपको सूखे स्पेसिफिकेशन से बोर नहीं करूंगा। इसके बजाय, मैं असली उदाहरण दूंगा जिन्हें आप आज ही चला सकते हैं (लगभग)। चलिए शुरू करते हैं।
\n\nवर्चुअल थ्रेड्स (Project Loom) — ब्लॉकिंग का अंत
\nयह शायद सबसे बड़ा बदलाव है। वर्चुअल थ्रेड्स (virtual threads) हल्के थ्रेड्स होते हैं जो आपको सिंक्रोनस स्टाइल में एसिंक्रोनस कोड लिखने की अनुमति देते हैं। 2025 में ये आखिरकार स्थिर हो जाते हैं और प्रोडक्शन के लिए अनुशंसित हैं।
\nपहले आप कुछ इस तरह लिखते थे:
\nExecutorService executor = Executors.newFixedThreadPool(10);\nexecutor.submit(() -> {\n // ब्लॉकिंग कॉल\n String result = restTemplate.getForObject(url, String.class);\n return result;\n});\nसमस्या यह है कि हर थ्रेड एक भारी ऑब्जेक्ट है। 10 थ्रेड्स ठीक हैं, 10,000 थ्रेड्स पहले से ही समस्या पैदा करते हैं। वर्चुअल थ्रेड्स के साथ, आप मेमोरी की चिंता किए बिना लाखों थ्रेड्स चला सकते हैं:
\ntry (var executor = Executors.newVirtualThreadPerTaskExecutor()) {\n for (int i = 0; i < 100_000; i++) {\n executor.submit(() -> {\n // अब यह हल्का है\n String result = restTemplate.getForObject(url, String.class);\n return result;\n });\n }\n}\nमुख्य अंतर: वर्चुअल थ्रेड्स OS थ्रेड्स से बंधे नहीं होते। जब कोई थ्रेड ब्लॉक होता है (जैसे I/O पर), JVM बस उसे दूसरे वर्चुअल थ्रेड पर स्विच कर देता है। कोई अतिरिक्त खर्च नहीं।
\nआपके लिए इसका क्या मतलब है? CompletableFuture और रिएक्टिव लाइब्रेरी जैसे जटिल एसिंक्रोनस फ्रेमवर्क को भूल जाइए। 2025 में, वर्चुअल थ्रेड्स पर मानक सिंक्रोनस कोड तेज़ और सरल दोनों होगा।
\n\nमाइग्रेट कैसे करें
\nnewFixedThreadPool को newVirtualThreadPerTaskExecutor से बदलें। अगर आप Spring Boot का उपयोग करते हैं, तो वर्जन 3.2+ पर अपडेट करें, वहाँ पहले से सपोर्ट है। बस सुनिश्चित करें कि आपकी लाइब्रेरी क्रिटिकल सेक्शन में synchronized का उपयोग नहीं करतीं — यही एकमात्र जगह है जहाँ वर्चुअल थ्रेड्स "अटक" सकते हैं।
पैटर्न मैचिंग और Switch — कोड छोटा हो जाता है
\n2025 में पैटर्न मैचिंग switch और instanceof तक पहुँच गया है। अब कई नेस्टेड if-else के बजाय आप संक्षिप्त और पढ़ने योग्य कोड लिख सकते हैं।
पहले (पुराना तरीका):
\nif (obj instanceof String) {\n String s = (String) obj;\n System.out.println(s.length());\n} else if (obj instanceof Integer) {\n Integer i = (Integer) obj;\n System.out.println(i * 2);\n}\nअब (Java 21+):
\nswitch (obj) {\n case String s -> System.out.println(s.length());\n case Integer i -> System.out.println(i * 2);\n case null -> System.out.println("null");\n default -> System.out.println("unknown");\n}\ncase null पर ध्यान दें — यह एक अलग सुधार है। पहले switch null पास करने पर NullPointerException फेंकता था। अब आप इसे स्पष्ट रूप से हैंडल कर सकते हैं।
एक और बढ़िया फीचर है record patterns। अगर आपके पास record है:
\nrecord Point(int x, int y) {}\nतो आप लिख सकते हैं:
\nif (obj instanceof Point(int x, int y)) {\n System.out.println("x=" + x + ", y=" + y);\n}\nबिना किसी अतिरिक्त टाइप कास्टिंग के। 2025 में यह मेनस्ट्रीम होगा — कोड को साफ करने के लिए इसका उपयोग करें।
\n\nगार्बेज कलेक्शन: ZGC और Generational GC
\n2025 में गार्बेज कलेक्शन और भी तेज़ हो गया है। ZGC (Z Garbage Collector) अब अधिकांश एप्लिकेशन के लिए डिफ़ॉल्ट रूप से सक्षम है। इसका