2012-08-02 14 views
12

यह प्रभावी जावायह कहने का क्या अर्थ है कि int enum पैटर्न संकलित-समय स्थिरांक हैं?

कार्यक्रम कि पूर्णांक enum पैटर्न का उपयोग भंगुर होते हैं से है। चूंकि int enums संकलन-समय स्थिरांक हैं, इसलिए वे उन ग्राहकों में संकलित किए जाते हैं जो उनका उपयोग करते हैं।

कुछ एक व्याख्या कर सकते हैं क्यों पूर्णांक enum पैटर्न संकलित प्रकार लगातार कहा जाता है और ग्राहकों में संकलित द्वारा क्या मतलब है?

यहाँ s 'इस तरह के एक निरंतर का एक उदाहरण:

public static final int APPLE_FUJI = 0; 
+0

यह कुछ ऑप्टिमाइज़ेशन 'जावैक' में से एक है और आम तौर पर मैं इसे नहीं करता;) –

उत्तर

17

मान लीजिए आप दो फ़ाइलें:

Foo.java: 
public class Foo 
{ 
    public static final int SOMETHING = 1; 
} 

Bar.java: 
public class Bar 
{ 
    public static void main(String[] args) 
    { 
     System.out.println(Foo.SOMETHING); 
    } 
} 

, उन दोनों को संकलित करें java Bar चलाने के लिए और इसे प्रिंट बाहर 1.

अब बदल Foo.java तो SOMETHING 2 है कि होगा, और पुन: संयोजित सिर्फ फू .java। Rerun java Bar और यह अभी भी प्रिंट 1 होगा। निरंतर मान को कोड के प्रत्येक टुकड़े पर कॉपी किया जाएगा, जो कि Foo से निष्पादन समय पर मूल्य मांगने के बजाय किया जाएगा।

अभ्यास में, यदि आप सब कुछ पुन: संयोजित किसी भी समय कुछ भी परिवर्तन, यह एक समस्या नहीं है।

+0

जावा गतिशील बाध्यकारी भाषा नहीं है? हमें सबकुछ फिर से क्यों करना है? – Geek

+2

@ गीक आप ** ** ऐसा करने के लिए ** नहीं है। लेकिन जॉन स्कीट ऊपर वर्णित करने से बचने के लिए इसकी अत्यधिक अनुशंसा की जाती है। जावा संकलक का यह व्यवहार मेरी राय में एक बुरा है। वह निरंतर केवल 'Foo.class' में संग्रहीत किया जाना चाहिए। 'बार' हमेशा उस 'फू' से स्थिर होना चाहिए। किसी भाषा में कई अन्य अर्ध-बेवकूफ चीजों की तरह: यह बदले नहीं जायेगा क्योंकि शायद यह मौजूदा कोड तोड़ देगा। रोने-बच्चों का कितना गुच्छा ... –

+0

@ गीक: आपको अपने पहले प्रश्न का उत्तर देने के लिए "गतिशील बाध्यकारी भाषा" परिभाषित करना होगा। लेकिन इस मामले में आपको पुन: संकलित करने का कारण यह है कि भाषा विनिर्देश स्पष्ट रूप से इस तरह के निरंतर अभिव्यक्तियों को बुलाता है। –

5

मूल्य' 0 'ही संकलन के दौरान .class फाइलों में बनाया जाएगा। यदि आप उस मान को बदलते हैं, तो आपको सब कुछ का उपयोग करना होगा जो इसका उपयोग करता है, जिसमें आपके एप्लिकेशन/लाइब्रेरी का उपयोग करने वाले किसी क्लाइंट के कोड शामिल हैं।

यदि आप नहीं करते हैं, तो आपको चेतावनी नहीं मिलेगी, बल्कि गलत व्यवहार होगा।

यदि आपके संकलन-समय निरंतर आपके कोड में पूरी तरह से उपयोग किया जाता है तो यह एक पूर्ण साफ/निर्माण चक्र मानते हुए एक समस्या से कम है। यदि आपका कोड तब व्यापक दर्शक तक पहुंचता है तो यह एक समस्या से अधिक हो जाता है।

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