2013-03-09 12 views
25

अंतिम चर और संकलन समय स्थिरांक के बीच क्या अंतर है?अंतिम चर के बीच अंतर और संकलन समय स्थिर

निम्नलिखित कोड

final int a = 5; 
final int b; 
b=6; 
int x=0; 
switch(x) 
{ 
    case a: //no error 
    case b: //compiler error 
} 

पर विचार करें इसका क्या मतलब है? अंतिम चर कब और कैसे मूल्य आवंटित किए जाते हैं? रन टाइम पर क्या होता है और संकलन समय पर क्या होता है? हमें एक संकलन समय निरंतर स्विच क्यों करना चाहिए? जावा की अन्य संरचनाएं संकलन समय निरंतर मांगती हैं?

+0

कृपया जेएलएस –

उत्तर

26

समस्या यह है कि सभी case: कथन संकलन समय पर परम होना चाहिए। आपका पहला कथन परम है। a 100% के लिए 5 से कोई अन्य मूल्य नहीं होगा।

final int a = 5; 

हालांकि, इस b के लिए इसकी गारंटी नहीं है। क्या होगा यदि b के आसपास कोई if-statement होगा?

final int b; 
if(something()) 
    b=6; 
else 
    b=5; 
2

स्विच स्टेटमेंट को निरंतर आवश्यकता है। चूंकि अंतिम चर को प्रारंभ में देरी हो सकती है और संकलक बी के लिए निर्धारित नहीं कर सकता है कि उसके पास केस शाखा में मूल्य है।

+6

में विषय के इस विशेष भाग के लिंक को देखें, लेकिन मुझे अभी भी मेरे प्रश्नों का उत्तर नहीं मिला है –

7

इसका क्या मतलब है?

इसका मतलब है कि 'बी' संकलन समय निरंतर अभिव्यक्ति नहीं है, और जेएलएस को यह होना आवश्यक है।

अंतिम चर कब और कैसे मूल्य आवंटित किए जाते हैं?

औपचारिक रूप से, जब असाइनमेंट स्टेटमेंट या प्रारंभकर्ता निष्पादित किया जाता है।

लेकिन व्यवहार में, यदि final संकलन समय निरंतर घोषित करता है तो अभिव्यक्ति का संकलन समय पर मूल्यांकन किया जाता है और इसका मूल्य कोड में हार्ड-वायर्ड होता है।

रन टाइम पर क्या होता है और संकलन समय पर क्या होता है?

ऊपर देखें।

हमें एक संकलन समय निरंतर क्यों स्विच करना चाहिए?

क्योंकि जेएलएस को की आवश्यकता है।

बाइटकोड संकलक के लिए यह आवश्यक है कि स्विच स्टेटमेंट अच्छी तरह से बनाया गया हो; यानी कि स्विच स्थिरांक के मूल्य टकरा नहीं जाते हैं। यह जेआईटी कंपाइलर को कोड उत्पन्न करने की अनुमति देता है जो स्विच स्थिरांक के वास्तविक मूल्यों के लिए अनुकूलित किया गया है।

जावा की अन्य संरचनाएं संकलन समय निरंतर मांगती हैं?

कोई भी नहीं जो मैं अपने सिर के ऊपर से सोच सकता हूं।

3

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

final int a = 4; // compiler is sure a is initialized 
final int b;// variable b is not guranted to be assigned 

उदा। हालांकि यह कथन अंततः बी शुरू करेगा, लेकिन संकलक इसे पहचान नहीं सकता है।

if (a < 4) b= 10; 
if (a >= 4) b = 8 
2

final int b; एक बार सौंपा जा सकता है और मूल्य है कि शर्तों के आधार पर क्रम पर निर्णय लिया जाएगा, यकीन है कि नहीं है। यही कारण है कि अंतिम परिवर्तनीय होने पर भी, यह COMPILE समय स्थिर नहीं है हालांकि यह रन टाइम निरंतर और केस को समय स्थिरांक संकलित करने की आवश्यकता है।

संबंधित मुद्दे