मैं समझता हूं कि संकलक को संकलित करने के लिए संकलित समय पर अभिव्यक्ति की आवश्यकता होती है, लेकिन Foo.BA_ स्थिर क्यों नहीं है?
हालांकि वे किसी भी कोड के दृष्टिकोण से स्थिर होते हैं जो खेतों के प्रारंभिक होने के बाद निष्पादित होते हैं, वे जेएलएस द्वारा आवश्यक अर्थों में एक संकलन समय स्थिर नहीं होते हैं ; एक स्थिर अभिव्यक्ति 1 के विनिर्देशन के लिए specification15.28 लगातार अभिव्यक्तियाँ देखें । यह .44.12.4 फाइनल वेरिएबल्स को संदर्भित करता है जो "स्थिर चर" को परिभाषित करता है:
हम एक चर को आदिम प्रकार या टाइप स्ट्रिंग कहते हैं, जो एक अंतिम-समय स्थिर अभिव्यक्ति (a15.28) एक स्थिर चर के साथ आरंभिक है। वैरिएबल एक स्थिर वैरिएबल है या क्लास इनिशियलाइज़ेशन (is12.4.1), बाइनरी कम्पैटिबिलिटी (compatibility13.1, .413.4.9) और निश्चित असाइनमेंट ()16) के संबंध में निहितार्थ नहीं हो सकता है।
आपके उदाहरण में, Foo.BA * चर में इनिशियलाइज़र नहीं हैं, और इसलिए "निरंतर चर" के रूप में योग्य नहीं हैं। फिक्स सरल है; Foo.BA को बदलें। चर घोषणाओं में ऐसे कंपाइलर हैं जो संकलन-समय स्थिर अभिव्यक्ति हैं।
अन्य उदाहरणों में (जहाँ इनिशियलाइज़र्स पहले से ही कंपाइल-टाइम कंटीन्यूअस एक्सप्रेशन हैं), वैरिएबल को घोषित करना final
कि क्या जरूरत है।
आप अपने कोड को स्थिरांक के enum
बजाय उपयोग करने के लिए बदल सकते हैं int
, लेकिन यह विभिन्न प्रतिबंधों की एक और जोड़ी लाता है:
1 - निरंतर अभिव्यक्ति प्रतिबंधों को संक्षेप में निम्नानुसार किया जा सकता है। निरंतर अभिव्यक्तियाँ a) आदिम प्रकारों का उपयोग कर सकती हैं और String
केवल, b) उन प्राथमिकताओं को अनुमति देती हैं जो शाब्दिक हैं (इसके अलावा null
) और निरंतर चर केवल, c) निरंतर अभिव्यक्तियों को संभवत: उप-विभाजनों के रूप में संक्षिप्त किया जा सकता है, घ) असाइनमेंट ऑपरेटरों ++
, --
या के अलावा ऑपरेटरों को अनुमति देते हैं , या instanceof
, और ई) प्रकार की जातियों को आदिम प्रकार या String
केवल अनुमति देते हैं ।
ध्यान दें कि यह विधि या लैम्ब्डा कॉल के किसी भी रूप में शामिल नहीं है, , ।new
या सरणी सबस्क्रिप्टिंग। इसके अलावा, सरणी मानों, मानों, आदिम आवरण प्रकारों के मूल्यों, बॉक्सिंग और अनबॉक्सिंग के सभी उपयोगों को क) के कारण बाहर रखा गया है।.class
.length
enum