2011-01-15 7 views
9

मैंने नीचे दिए गए शो के रूप में slf4j में कुछ कोड देखा। मुझे नहीं पता कि यहां निरंतर तहखाने से क्यों बचें। क्या ऐसा करना जरूरी है? या बस सबसे अच्छा अभ्यास। ऐसा करने का क्या फायदा है?जावा में लगातार फोल्डिंग से बचने के लिए क्यों? कब?

धन्यवाद।

/** 
    * Declare the version of the SLF4J API this implementation is compiled against. 
    * The value of this field is usually modified with each release. 
    */ 
// to avoid constant folding by the compiler, this field must *not* be final 
public static String REQUESTED_API_VERSION = "1.6"; // !final** 
+0

क्या आपने इस विषय पर विकी देखा है? मुझे लगता है कि यह बहुत अच्छी तरह से बताता है। http://en.wikipedia.org/wiki/Constant_folding – CoolBeans

+0

आप इस फ़ील्ड को उजागर करने के बजाय एक विधि का उपयोग कर सकते हैं (शायद सबसे अच्छा), 'अंतिम' का उपयोग करें, लेकिन विधि ('1.6" .toString() ') या एक * संकलन-समय स्थिर होने से रोकने के लिए कुछ कोड जोड़ें * फिर भी कोई अनावश्यक बाइटकोड नहीं जोड़ें ('शून्य! = शून्य?" ":" 1.6 "')। –

+0

हाँ, सार्वजनिक स्थैतिक स्थिरांक icky हैं! –

उत्तर

6

विशेष मामले जहां एक पुस्तकालय जारी कर रहे हैं में, आप अक्सर है कि अंततः अंत में जुड़ा हुआ है लॉगिंग पुस्तकालय के अंतिम संस्करण का नियंत्रण नहीं है। उदाहरण के लिए आप संस्करण 1.6 का उपयोग कर रहे हैं, और आपके लाइब्रेरी का उपयोग करने वाले एप्लिकेशन में बगफिक्स प्राप्त करने के लिए 1.6.1 का उपयोग किया जा सकता है। चूंकि यह केवल एक बिंदु रिलीज है, इसलिए एपीआई संगत होना चाहिए, लेकिन यदि आपकी लाइब्रेरी एसएलएफ 4 जे संस्करण का निरीक्षण करती है तो इसे 1.6.1 1.6 नहीं दिखाना चाहिए।

यदि निरंतर रेखांकित किया गया है तो आप 1.6 देखेंगे (क्योंकि यह आपकी कक्षा फ़ाइल में कॉपी किया गया है) भले ही पुस्तकालय को इस तथ्य के बाद अपग्रेड किया गया हो।

+0

एविसिंथ पर काम करने के लिए प्रयुक्त एक प्रोजेक्ट ने इसे मुश्किल तरीके से पाया जब वे अपने एबीआई को मामूली संस्करणों के बीच बढ़ाने के लिए गए। बहुत अधिक इनलाइनिंग और बहुत अधिक वीसी 6 निर्भरता के कारण संभव नहीं था। अगला प्रमुख संस्करण "वर्चुअल" एबीआई का इस्तेमाल करता था और बहुत अच्छा काम करता था। – SilverbackNet

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