2009-11-07 20 views
18

में सार्वजनिक स्थैतिक अंतिम चर मेरे कामस्थल पर जावा कोड में आने वाला होता है। यहां परिदृश्य है: 2 कक्षाएं हैं - ClassA और ClassBआयातित जावा क्लास

ClassA में इसके अंदर 4 सार्वजनिक स्थैतिक अंतिम स्ट्रिंग मानों को छोड़कर कुछ भी नहीं है। इसका उद्देश्य उन मानों का उपयोग करना है जैसे ClassA.variable (मुझसे मत पूछें, यह मेरा कोड क्यों नहीं है)।

ClassB आयात ClassA। मैंने स्ट्रिंग मानों को ClassA में संपादित किया और इसे संकलित किया। जब मैं ClassB चला गया तो मैं देख सकता था कि यह पुराने मानों का उपयोग कर रहा था - न कि नए मान। ClassA से नए मानों का उपयोग करने के लिए मुझे ClassB को पुन: संकलित करना पड़ा! (मुझे ClassA आयात करने वाले अन्य वर्गों को दोबारा बनाना था!) ​​

क्या यह सिर्फ जेडीके 1.6 की वजह से है या मुझे पहले ClassB को पुन: संकलित करने के लिए जाना चाहिए था! मुझे सूचित करो। :)

उत्तर

23

वर्ग ClassA से final चरों के मान संकलन समय स्थिरांक हो रहे हैं तो संकलक उन्हें वर्गों में के बजाय ClassA का उपयोग कर एक रन-टाइम संदर्भ पैदा inlined हो सकता है। मुझे लगता है, यह आपके द्वारा वर्णित मामले में हुआ था।

उदाहरण:

public class Flags { 
    public static final int FOO = 1; 
    public static final int BAR = 2; 
} 

public class Consumer { 
    public static void main(String[] args) { 
     System.out.println(Flags.FOO); 
    } 
} 

इस उदाहरण में, संकलक संभावना बजाय बराबर रन-टाइम संदर्भ पैदा करने की Consumer लिए बनाए गए कोड में FOO का मूल्य शामिल कर लेगा। यदि FOO का मान बाद में बदलता है, तो आपको नए मान का उपयोग करने के लिए Consumer को फिर से संकलित करना होगा।

यह एक अनुकूलन है, जिसमें संकलित प्रोग्राम की दक्षता और गति के संबंध में कुछ फायदे हैं। इस उदाहरण में

int x = Flags.FOO * 10; 

मूल्य (यहाँ: 1) इनलाइन करने, उदाहरण के लिए, मूल्य को इनलाइन भाव है, जो इसका इस्तेमाल में आगे अनुकूलन, उदाहरण के लिए सक्षम हो सकता है, संकलक सूचना के लिए सक्षम बनाता है कि गुणा बनाता है कोई फर्क नहीं पड़ता, और पूरी तरह से छोड़ा जा सकता है।

+1

तो, आप कह रहे हैं कि सार्वजनिक स्थिर अंतिम समय स्थिरता संकलित है? उसे नहीं पता था। सोचा कि यह सिर्फ एक स्थिर था और रनटाइम में संशोधित नहीं किया जा सकता है! आपकी सहायता के लिए धन्यवाद। –

+3

अच्छा anwser। यदि आप देखना चाहते हैं कि चर को रेखांकित किया जा रहा है, तो आप यह देखने के लिए जावप का उपयोग कर सकते हैं कि कक्षा को कैसे संकलित किया गया था, उदा। "जावप-सी झंडे"। –

3

यह एक बाइनरी संगतता समस्या है। निरंतर क्षेत्रों के संदर्भ संकलित समय पर हल किए जाते हैं। जो व्यवहार आप देख रहे हैं वह सही है; यदि आप कक्षा ए में मानों को बदलते हैं तो आपको क्लाइंट (कक्षा बी) को फिर से संकलित करना होगा। ऐसी समस्याओं से बचने के लिए जावा रिलीज 5.0 में पेश किए गए एनम प्रकार का उपयोग करके स्थिरांक जोड़ने पर विचार करें।

2

आप कक्षाओं को अलग-अलग संकलित करने का प्रयास क्यों कर रहे हैं?

मेवेन या चींटी जैसी बिल्ड सिस्टम का उपयोग करें या बस अपना आईडीई इसे करें।

ऐसा करने के लिए एकमात्र सुरक्षित बात यह है कि प्रत्येक जावा को फिर से सम्मिलित करना जो जावा क्लास पर निर्भर करता है जो तब तक बदल गया है जब तक कि प्रत्येक वर्ग को प्रभावित नहीं किया जा सकता है।

+0

कक्षाओं में से एक या अन्य आपके नियंत्रण में नहीं हो सकता है। – DJClayworth

2

आप एक स्विच में मानों का उपयोग नहीं कर रहे हैं, तो आप इस बजाय कर सकते हैं:

public class A 
{ 
    public static final int FOO; 
    public static final String BAR; 

    static 
    { 
     FOO = 42; 
     BAR = "Hello, World!"; 
    } 
} 

तो संकलक अब कठिन मूल्यों अन्य वर्गों है कि उन्हें प्रयोग कर रहे हैं में कोड होगा।

2

मान लीजिए ClassA इस तरह दिखता है:

public class ClassA { 
    public static final int FOO = 1; 
    public static final int BAR = 2; 
} 

आप इसे पुन: संयोजित हैं, ClassB पुराने मूल्यों का उपयोग जारी रहेगा। मुझे लगता है कि यह संकलक पर निर्भर हो सकता है, लेकिन मुझे लगता है कि यह सामान्य व्यवहार है। आप ClassB ClassA परिवर्तन में हर एक निरंतर पुन: संयोजित नहीं करना चाहते हैं, तो आप कुछ इस तरह करना होगा:

public class ClassA { 
    public static final int FOO = CONST(1); 
    public static final int BAR = CONST(2); 

    public static int CONST(int i) { return i; } 
} 

क्योंकि अब javac स्थिरांक इनलाइन करने को तैयार नहीं है। इसके बजाय क्लास के स्थिर प्रारंभकर्ता चलने पर यह CONST (int) विधि को कॉल करेगा।

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