हमें स्थिरांक के दो पहलुओं को अलग करने की आवश्यकता है:
- विकास समय पर ज्ञात मूल्यों के नाम, जिन्हें हम बेहतर रखरखाव के लिए पेश करते हैं, और
- मान जो संकलक के लिए उपलब्ध हैं।
और फिर एक संबंधित तीसरा प्रकार है: चर जिसका मान नहीं बदलता है, अर्थात मान के लिए नाम। इन अपरिवर्तनीय चर और स्थिरांक के बीच का अंतर तब होता है जब मूल्य निर्धारित / असाइन / प्रारंभ किया जाता है: एक चर को रनटाइम पर आरंभीकृत किया जाता है, लेकिन एक निरंतर का मान विकास के दौरान जाना जाता है। यह अंतर थोड़ा मैला है क्योंकि एक मूल्य विकास के दौरान जाना जा सकता है लेकिन वास्तव में केवल आरंभीकरण के दौरान बनाया गया है।
लेकिन यदि किसी स्थिरांक का मान संकलन-समय पर ज्ञात होता है, तो संकलक उस मान के साथ संगणना कर सकता है। उदाहरण के लिए, जावा भाषा में निरंतर अभिव्यक्ति की अवधारणा है । एक स्थिर अभिव्यक्ति किसी भी अभिव्यक्ति है जिसमें केवल प्राथमिक या स्ट्रिंग के शाब्दिक होते हैं, निरंतर अभिव्यक्ति (जैसे कि कास्टिंग, इसके अलावा, स्ट्रिंग संयोजन) और निरंतर चर पर संचालन। [ JLS J15.28 ] एक स्थिर चर एक final
चर है जिसे एक स्थिर अभिव्यक्ति के साथ आरंभ किया जाता है। [JLS this4.12.4] जावा के लिए तो, यह एक संकलन-समय स्थिर है:
public static final int X = 7;
यह तब दिलचस्प हो जाता है जब कई संकलन इकाइयों में एक स्थिर चर का उपयोग किया जाता है, और फिर घोषणा को बदल दिया जाता है। विचार करें:
अब जब हम इन फाइलों को संकलित करते हैं तो B.class
बायटेकोड एक क्षेत्र घोषित करेगा Y = 9
क्योंकि B.Y
एक स्थिर चर है।
लेकिन जब हम A.X
वैरिएबल को एक अलग मान (कहते हैं X = 0
) में बदल देते हैं और केवल A.java
फ़ाइल को फिर से जोड़ते हैं , तब B.Y
भी पुराने मान को संदर्भित करता है। यह राज्य A.X = 0, B.Y = 9
स्रोत कोड में घोषणाओं के साथ असंगत है। खुश डिबगिंग!
इसका मतलब यह नहीं है कि स्थिरांक को कभी नहीं बदलना चाहिए। स्रोत कोड में स्पष्टीकरण के बिना दिखाई देने वाली जादू की संख्या की तुलना में लगातार निश्चित रूप से बेहतर हैं। हालांकि, मूल्य सार्वजनिक स्थिरांक के लिए अपनी सार्वजनिक एपीआई का हिस्सा है । यह जावा के लिए विशिष्ट नहीं है, लेकिन C ++ और अन्य भाषाओं में भी होता है जो अलग संकलन इकाइयाँ पेश करते हैं। यदि आप इन मूल्यों को बदलते हैं, तो आपको सभी आश्रित कोड को फिर से इकट्ठा करना होगा, अर्थात एक स्वच्छ संकलन करना होगा।
स्थिरांक की प्रकृति के आधार पर, वे डेवलपर्स द्वारा गलत धारणाओं का कारण बन सकते हैं। यदि इन मानों को बदल दिया जाता है, तो वे बग को ट्रिगर कर सकते हैं। उदाहरण के लिए, स्थिरांक का एक सेट चुना जा सकता है ताकि वे कुछ निश्चित पैटर्न बना सकें, जैसे public static final int R = 4, W = 2, X = 1
। यदि इन्हें अलग संरचना बनाने के लिए बदल दिया जाए R = 0, W = 1, X = 2
तो मौजूदा कोड जैसे कि boolean canRead = perms & R
गलत हो जाता है। और सिर्फ मजाक के बारे में सोचें जो कि Integer.MAX_VALUE
बदल जाएगा! यहां कोई फिक्स नहीं है, यह याद रखना महत्वपूर्ण है कि कुछ स्थिरांक का मूल्य वास्तव में महत्वपूर्ण है और बस बदला नहीं जा सकता है।
लेकिन अधिकांश स्थिरांक उन्हें बदलने के लिए ठीक हैं, जब तक कि उपरोक्त प्रतिबंधों को माना जाता है। एक निरंतर परिवर्तन तब सुरक्षित होता है जब अर्थ, विशिष्ट मूल्य महत्वपूर्ण नहीं होता है। इस तरह के रूप में tunables के लिए मामला जैसे है BORDER_WIDTH = 2
या TIMEOUT = 60; // seconds
या टेम्पलेट्स जैसे API_ENDPOINT = "https://api.example.com/v2/"
- हालांकि यकीनन कुछ या उन सभी कोड विन्यास फाइल के बजाय में निर्दिष्ट किया जाना चाहिए।