प्रतिनिधि इंटरव्यू विषय

Java Interview: Java 25 Flexible Constructor Bodies के साथ क्या बदला?

कोडिंगकठिन
Offer.cc संपादकीय टीमप्रकाशित अपडेट किया गया

प्रश्न

समझाएं कि Java 25 Flexible Constructor Bodies super() या this() से पहले क्या अनुमति देता है, और कौन से accesses अवैध बने रहते हैं।

प्रश्न और परिदृश्य

Java 25 Flexible Constructor Bodies (JEP 513) को अंतिम रूप (finalize) देता है। समझाएं कि एक explicit super(...) या this(...) से पहले क्या रन हो सकता है, निर्माणाधीन (under construction) ऑब्जेक्ट को क्यों नहीं पढ़ा जा सकता है, और यह फीचर inheritance तथा argument preprocessing को कैसे प्रभावित करता है।

इंटरव्यूअर क्या टेस्ट कर रहा है

  • Constructor chains और इस सुरक्षा नियम की समझ कि instance अभी इनिशियलाइज़ नहीं हुआ है।
  • अनुमत static या local लॉजिक और this के अवैध एक्सेस के बीच अंतर करना।
  • Preview बनाम final वर्ज़न और source/target migration जोखिम को पहचानना।

उत्तर देने से पहले स्पष्ट करने वाले प्रश्न

स्पष्ट करें कि टारगेट अंतिम JDK 25 फीचर है या पिछला JEP 447/482/492 preview, साथ ही प्रोजेक्ट के source, target और runtime वर्ज़न क्या हैं। स्पष्ट करें कि फोकस syntax पर है, JVM verification पर, या super(...) arguments तैयार करने वाले किसी helper को inline करने पर है।

30-सेकंड उत्तर फ्रेमवर्क

पारंपरिक Java में यह आवश्यक था कि पहला constructor statement super(...) या this(...) हो। Flexible Constructor Bodies उस invocation से पहले एक प्रतिबंधित prologue की अनुमति देता है, जैसे कि locals की गणना करना या वर्तमान क्लास के फ़ील्ड्स को इनिशियलाइज़ करना, लेकिन कोड निर्माणाधीन instance को पढ़ या कॉल नहीं कर सकता है और न ही किसी uninitialized this को किसी arbitrary कोड में पास कर सकता है। यह सुरक्षित superclass construction क्रम को बनाए रखते हुए डायरेक्ट argument preprocessing को सक्षम बनाता है।

चरण-दर-चरण विस्तृत उत्तर

  1. एक constructor में एक prologue, एक explicit constructor invocation, और शेष body होती है। this(...) वर्तमान-क्लास chain को जारी रखता है; super(...) parent में प्रवेश करता है।
  2. Prologue locals को declare कर सकता है, instance state से स्वतंत्र expressions का मूल्यांकन कर सकता है, और वर्तमान क्लास के उन फ़ील्ड्स को इनिशियलाइज़ कर सकता है जो अभी भी uninitialized हैं। वे वैल्यूज़ constructor arguments को दी जा सकती हैं।
  3. यह instance fields को नहीं पढ़ सकता, instance methods को कॉल नहीं कर सकता, this को argument के रूप में उपयोग नहीं कर सकता, या किसी आंशिक रूप से इनिशियलाइज़्ड ऑब्जेक्ट को observable कोड के सामने उजागर नहीं कर सकता।
  4. कंपाइलर और JVM ट्रैक करते हैं कि कौन से फ़ील्ड्स uninitialized रहते हैं ताकि एक superclass constructor किसी अमान्य initialization क्रम को न देख सके। जहां नियम अनुमति देते हैं, वहां Static methods और constants का उपयोग किया जा सकता है।
  5. Migration के दौरान, किसी helper को केवल तभी हटाएं जब वह पूरी तरह से super(...) arguments तैयार करने के लिए ही मौजूद था; साइड इफेक्ट्स, एकाधिक callers, या स्वतंत्र परीक्षण मूल्य (independent test value) वाले helpers को बनाए रखें।
  6. JDK 25 टूलचेन के साथ कंपाइल और रन करें। पुराने source/target को लक्षित करने वाला प्रोजेक्ट केवल syntax को सीधे नहीं अपना सकता।
java
class Child extends Parent {
    private final String normalized;

    Child(String raw) {
        var value = raw.trim();       // prologue: local computation
        super(value);                 // explicit constructor invocation
        this.normalized = value;
    }
}

उच्च-गुणवत्ता वाला नमूना उत्तर

JEP 513 super(...) या this(...) से पहले एक प्रतिबंधित prologue की अनुमति देता है। यह argument preprocessing और वर्तमान-क्लास फ़ील्ड initialization के लिए उपयोगी है जो instance state पर निर्भर नहीं करते हैं, लेकिन यह अभी भी fields पढ़ने, instance methods को कॉल करने, या uninitialized this को उजागर करने पर रोक लगाता है। कंपाइलर और JVM इस गारंटी को बनाए रखते हैं कि superclass केवल वैध initialization स्थिति ही देखे। मैं JEP 447/482/492 previews और JDK 25 final फीचर के बीच अंतर करूँगा और source, target और runtime वर्ज़न की जांच करूँगा। यह फीचर constructor-order या inheritance-safety बाधाओं को हटाए बिना एकमुश्त static helpers को कम करता है।

सामान्य त्रुटियां

  • यह कहना कि super() से पहले कोई भी statement आ सकता है।
  • इस बात की उपेक्षा करना कि this इनिशियलाइज़ नहीं हुआ है और instance reads या calls की अनुमति देना।
  • Preview JEP नंबर को अंतिम JDK 25 नंबर कहना।
  • कंपाइलर target और डिप्लॉयमेंट runtime की जांच किए बिना source को एडिट करना।
  • एक सुविधाजनक उदाहरण के लिए prologue में बाह्य रूप से अवलोकनीय (externally observable) साइड इफेक्ट्स जोड़ना।

फॉलो-अप प्रश्न और उत्तर

Local गणना की अनुमति क्यों है लेकिन this को पढ़ने की क्यों नहीं?

Local गणना किसी आंशिक रूप से इनिशियलाइज़्ड ऑब्जेक्ट का अवलोकन नहीं कर सकती। Field reads या method calls डायनेमिक डिस्पैच (dynamic dispatch) को ट्रिगर कर सकते हैं, अपूर्ण स्थिति को उजागर कर सकते हैं, या superclass लॉजिक को टूटे हुए invariants दिखा सकते हैं।

क्या this(...) और super(...) से पहले के नियम समान हैं?

दोनों early-construction context द्वारा सीमित हैं। this(...) वर्तमान-क्लास chain को जारी रखता है और super(...) parent में प्रवेश करता है, लेकिन दोनों में से कोई भी वैध initialization से पहले instance state को उजागर नहीं कर सकता।

आपको पुराने helper को inline करने के बजाय कब बनाए रखना चाहिए?

इसे तब बनाए रखें जब इसके एकाधिक callers हों, सार्थक साइड इफेक्ट्स हों, स्वतंत्र परीक्षण मूल्य हो, या एक स्पष्ट मॉड्यूल सीमा हो। यह फीचर एक लैंग्वेज क्षमता है, कोई रीफैक्टरिंग अधिदेश (mandate) नहीं।

आप पुराने JDKs को कैसे सपोर्ट करते हैं?

एक पुराना source/target नए syntax का उपयोग नहीं कर सकता। जब तक कंपाइलर, runtime और रिलीज मैट्रिक्स को एक साथ अपग्रेड नहीं किया जाता, तब तक मौजूदा argument-preparation दृष्टिकोण को बनाए रखें।

सार्वजनिक स्रोत

संबंधित प्रश्न

संबंधित इंटरव्यू टूल

कोडिंग प्रॉम्प्ट के लिए स्क्रीनशॉट का उपयोग करें

समस्या को कैप्चर करें, फिर क्रम से प्रतिबंधों (constraints), समाधान, कोड, एज केस और जटिलता पर काम करें।

टूल देखें