जावा, जहां एक स्थिर चर एक वर्ग के सभी उदाहरणों के लिए स्कोप वाला विपरीत, सी में static
मतलब यह है कि एक चर केवल फ़ाइल जहां यह घोषित किया जाता है के भीतर से पहुँचा जा सकता है। यह आपको फ़ंक्शन के अंदर एक स्थिर चर घोषित करने जैसी चीजों को करने की अनुमति देता है, जो like this के माध्यम से केवल पहली बार मान सेट करता है।
एक चीज जिसका आपने उल्लेख नहीं किया है वह कक्षा ए, बी, और सी के बीच संबंध है। यदि वे विरासत पदानुक्रम में हैं, और आप स्थिर चर को जावा में विरासत में प्राप्त करने की उम्मीद कर रहे हैं, तो विधि द्वारा वर्णित विधि zpasternack काम करेगा।
यदि तीन वर्ग असंबद्ध हैं, और आप केवल ए में घोषित मूल्य तक पहुंच बनाना चाहते हैं, तो extern
जाने का एक और उचित तरीका है। इस मामले में, आप क्लासएएच में extern
के रूप में चर घोषित करना चाहते हैं, फिर इसे कक्षा.एम में परिभाषित करें। जब तक कक्षा बी और कक्षासी कक्षा ClassA.h आयात करते हैं, वे एक ही बाहरी परिभाषा के खिलाफ लिंक करने में सक्षम होंगे।
एक बढ़िया बिंदु यह है कि, extern
का उपयोग करने के बजाय, OBJC_EXPORT
का उपयोग करने के लिए यह अधिक मजबूत है, जिसे objc-api.h में परिभाषित किया गया है और सी ++ के तहत संकलन को संभालता है।
// ClassA.h
OBJC_EXPORT NSString* commonString;
...
// ClassA.m
NSString* commonString = @"OldValue";
// ClassB.m
#import "ClassA.h"
...
commonString = @"NewValue"; // Can be inside a function or method
बेशक
, externed वैरिएबल का उपयोग इस तरह से एक कुख्यात बहुत बदनाम वैश्विक चर है, जो कि किसी को भी पढ़ने के लिए या लिख सकते में कमजोर है बनाता है, और पहुँच अनियंत्रित है: यहाँ एक कोड नमूना है। यह सरल दृष्टिकोण है, और static
बनाम extern
का उपयोग करने के बारे में आपके प्रश्न का उत्तर देता है।हालांकि, एक डिजाइन सिद्धांत के रूप में, वर्ग विधियों के साथ चर को लपेटकर प्रदान किया गया encapsulation अधिक जटिल है, यद्यपि अधिक जटिल है। ऑब्जेक्ट उन्मुख भाषाओं में, जब आप जिस प्रभाव को प्राप्त करने का प्रयास कर रहे हैं वह क्लास-स्टेटिक विधि का है, तो encapsulation शायद जाने का सही तरीका है।
बहुत बहुत धन्यवाद। इसे हल किया। – Yogini