तो, जावा में, आपके कन्स्ट्रक्टर की पहली पंक्ति सुपर को कॉल करने के लिए है ... इसे स्पष्ट रूप से सुपर(), या स्पष्ट रूप से अन्य कन्स्ट्रक्टर को कॉल करना। मैं क्या जानना चाहता हूं, मैं इसके चारों ओर एक कोशिश क्यों नहीं कर सकता?मैं अपने सुपर() कॉल के आसपास एक कोशिश ब्लॉक का उपयोग क्यों नहीं कर सकता?
मेरा विशिष्ट मामला यह है कि मेरे पास एक परीक्षण के लिए नकली कक्षा है। कोई डिफ़ॉल्ट कन्स्ट्रक्टर नहीं है, लेकिन मैं चाहता हूं कि कोई परीक्षण को पढ़ने के लिए आसान बनाये। मैं कन्स्ट्रक्टर से एक रनटाइम अपवाद में फेंकने वाले अपवादों को भी लपेटना चाहता हूं।
तो, मुझे क्या करना चाहते हैं प्रभावी रूप से यह है:
public class MyClassMock extends MyClass {
public MyClassMock() {
try {
super(0);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
// Mocked methods
}
लेकिन जावा शिकायत है कि सुपर पहले बयान नहीं है।
मेरे वैकल्पिक हल:
public class MyClassMock extends MyClass {
public static MyClassMock construct() {
try {
return new MyClassMock();
} catch (Exception e) {
throw new RuntimeException(e);
}
}
public MyClassMock() throws Exception {
super(0);
}
// Mocked methods
}
यह सबसे अच्छा समाधान का है? जावा ने मुझे पूर्व क्यों नहीं किया?
को "क्यों" है कि जावा मुझे एक संभावित असंगत स्थिति में एक निर्माण वस्तु है यह बताने के लिए नहीं चाहता है ... फिर भी, एक नकली करने में, मुझे परवाह नहीं है के रूप में मेरा सबसे अच्छा अनुमान उसके बारे में। ऐसा लगता है कि मुझे उपर्युक्त करने में सक्षम होना चाहिए ... या कम से कम मुझे पता है कि उपरोक्त मेरे मामले के लिए सुरक्षित है ... या ऐसा लगता है कि यह वैसे भी होना चाहिए।
मैं परीक्षण कक्षा से उपयोग की जाने वाली किसी भी विधि को ओवरराइड कर रहा हूं, इसलिए कोई जोखिम नहीं है कि मैं अनियमित चर का उपयोग कर रहा हूं।
एक दिलचस्प नोट यह है कि यह पूरी तरह जावा भाषा सीमा है। समकक्ष बाइटकोड पूरी तरह से मान्य है। – Antimony
क्या आप वाकई बाइटकोड अभी भी वैध हैं? मुझे लगता है कि मैंने नीचे दिखाए गए परिणामी सुरक्षा छेद का शोषण करने के बाद इसे अवैध कर दिया है। – Joshua
क्योंकि नियम इसे अनुमति नहीं देते हैं। [जेडीके स्पेक] पढ़ें (http://docs.oracle.com/javase/specs/jvms/se7/html/jvms-4.html#jvms-4.10)। यहां तक कि यदि आप कंपाइलर से पहले प्राप्त करते हैं तो सत्यापनकर्ता इसे अस्वीकार कर देगा। –