दिलचस्प पोस्ट
कैसे sed के साथ स्लैश युक्त स्ट्रिंग को बदलने के लिए? मैं कैसे कर सकता हूँ jQuery के मामले केस असंवेदनशील, jQuery 1.8+ सहित? चयन सूची में कॉलम का कारण अमान्य है क्योंकि यह एक समेकित कार्य या ग्रुप बाय खंड में शामिल नहीं है <बटन> टैग में क्या नुकसान है? जांच लें कि कोई संख्या int या float है क्रॉस-ऑरिजन अनुरोध पर अवरुद्ध MATLAB गुमनाम समारोह में कई बयान कैसे निष्पादित करें? कैसे एक div बेतरतीब ढंग से एक पृष्ठ के चारों ओर ले जाने के लिए (jQuery या सीएसएस का उपयोग कर) बाध्यकारी कॉम्बो बॉक्स चयनित एमवीएमएम का प्रयोग कर रहा है I कैसे आप एक jQuery UI प्रगति पट्टी के लिए मूल्य चेतन करते हैं? नजदीकी वर्चुअल को परिणाम वस्तु का हिस्सा बनाने के लिए नहीं मिल सकता है एनएएसआईटीएगर को एक इंट में कनवर्ट कैसे करें? जेएसओएन से एक्सएमएल रूपांतरण के जावा कार्यान्वयन एजेक्स कॉल में सत्र का समय समाप्त करना mutate_each / summarise_each in dplyr: मैं कुछ कॉलम कैसे चुनूं और उत्परिवर्तित कॉलम के नए नाम दें?

गैर-स्थिर विधि के लिए एक स्थिर संदर्भ नहीं बना सकते

जावा में एक बहु-भाषा का अनुप्रयोग बनाना R.string संसाधन XML फ़ाइल से स्ट्रिंग मान R.string समय त्रुटि प्राप्त हो रही है:

 public static final String TTT = (String) getText(R.string.TTT); 

यह त्रुटि संदेश है:

त्रुटि: प्रकार संदर्भ से गैर-स्थिर विधि getText (int) के लिए एक स्थिर संदर्भ नहीं बना सकते

यह कैसे हुआ और मैं इसे कैसे हल कर सकता हूं?

Solutions Collecting From Web of "गैर-स्थिर विधि के लिए एक स्थिर संदर्भ नहीं बना सकते"

चूंकि getText() गैर-स्थिर है, इसलिए आप उसे एक स्थिर विधि से कॉल नहीं कर सकते।

समझने के लिए, आपको दोनों के बीच अंतर को समझना होगा।

उदाहरण (गैर-स्थिर) विधियों वस्तुओं पर काम करते हैं जो एक विशेष प्रकार (कक्षा) के हैं इन्हें इस तरह से नया बनाया गया है:

 SomeClass myObject = new SomeClass(); 

एक उदाहरण विधि कॉल करने के लिए, आप उसे myObject ( myObject ) पर कहते हैं:

 myObject.getText(...) 

हालांकि एक स्थिर विधि / फ़ील्ड को केवल प्रकार पर सीधे कहा जा सकता है, इस तरह से कहें: पिछला कथन सही नहीं है। कोई भी ऑब्जेक्ट संदर्भ के साथ myObject.staticMethod() साथ स्थिर फ़ील्ड्स का उल्लेख कर सकता है लेकिन यह निराश है क्योंकि यह स्पष्ट नहीं करता कि वे वर्ग चर हैं।

 ... = SomeClass.final 

और ये दोनों एक साथ काम नहीं कर सकते क्योंकि वे विभिन्न डेटा रिक्त स्थान (उदाहरण डेटा और कक्षा डेटा) पर काम करते हैं।

मुझे कोशिश करते हैं और समझाने दो। इस वर्ग पर विचार करें (पीईडोकॉक्ोड):

 class Test { string somedata = "99"; string getText() { return somedata; } static string TTT = "0"; } 

अब मेरे पास निम्न उपयोग का मामला है:

 Test item1 = new Test(); item1.somedata = "200"; Test item2 = new Test(); Test.TTT = "1"; 

मूल्य क्या हैं?

कुंआ

 in item1 TTT = 1 and somedata = 200 in item2 TTT = 1 and somedata = 99 

दूसरे शब्दों में, TTT एक ऐसा खण्ड है जो प्रकार के सभी उदाहरणों से साझा किया जाता है। तो यह कहने में कोई मतलब नहीं है

 class Test { string somedata = "99"; string getText() { return somedata; } static string TTT = getText(); // error there is is no somedata at this point } 

तो सवाल यह है कि टीटीटी स्थिर क्यों है या क्यों getText () स्थिर नहीं है?

static निकालें और इसे इस त्रुटि को मिल जाना चाहिए – लेकिन यह समझने के बावजूद कि यह आपकी अगली त्रुटि तक केवल एक चिपका प्लास्टर है getText() की आवश्यकताएं क्या हैं जो इसे गैर-स्थिर होने की आवश्यकता होती हैं?

पहले से स्पष्ट रूप से कुछ अच्छे उत्तर दिए गए हैं कि गैर स्थैतिक Context पद्धति getText() का मिश्रण आपके static final String साथ क्यों नहीं उपयोग किया जा सकता है।

एक अच्छा सवाल यह है कि आप ऐसा क्यों करना चाहते हैं? आप अपने strings संसाधन से एक String लोड करने का प्रयास कर रहे हैं, और इसका मान public static फ़ील्ड में पॉप्युलेट कर रहा है। मैं मानता हूं कि यह आपकी अन्य कक्षाओं में से कुछ इसे एक्सेस कर सकता है? यदि हां, तो ऐसा करने की कोई जरूरत नहीं है। इसके बजाय अपने अन्य कक्षाओं में एक Context पास करें और उनके भीतर से context.getText(R.string.TTT) कॉल करें।

 public class NonActivity { public static void doStuff(Context context) { String TTT = context.getText(R.string.TTT); ... } } 

और इसे अपनी Activity से कॉल करने के लिए:

 NonActivity.doStuff(this); 

यह आपको public static फ़ील्ड का उपयोग करने के लिए बिना अपनी String संसाधन तक पहुंचने की अनुमति देगा।

दूसरों को जो इस खोज में मिलते हैं:

मुझे अक्सर यह एक मिलता है जब मैं गलती से ऑब्जेक्ट नाम की बजाय क्लास नेम का उपयोग करते हुए फ़ंक्शन बुलाता हूं। यह आमतौर पर होता है क्योंकि मैं उन्हें समान नाम देता हूं: पी

अर्थात:

 MyClass myclass = new MyClass(); // then later MyClass.someFunction(); 

यह स्पष्ट रूप से एक स्थिर विधि है (somethings के लिए अच्छा) लेकिन मैं वास्तव में क्या करना चाहता था (ज्यादातर मामलों में था)

 myclass.someFunction(); 

यह ऐसी मूर्खतापूर्ण गलती है, लेकिन हर कुछ महीनों में, मैं "माइकलस" परिभाषाओं में वार्स के साथ 30 मिनट का समय बर्बाद कर रहा हूं, ताकि यह पता चलेगा कि क्या वास्तव में गलत क्या हो रहा है, यह सिर्फ एक टाइपो है।

मजेदार नोट: गलती को वास्तव में स्पष्ट करने के लिए स्टैक अतिप्रवाह सिंटैक्स को हाइलाइट करता है।

आप या तो अपने चर गैर स्थिर बना सकते हैं

 public final String TTT = (String) getText(R.string.TTT); 

या "gettext" पद्धति स्थिर बना (यदि संभव हो तो)

getText आपकी गतिविधि का सदस्य है, इसलिए इसे "यह" मौजूद होने पर कहा जाना चाहिए। आपका स्टैटिक वेरिएबल प्रारंभ होता है, जब आपकी गतिविधि तैयार की जाने से पहले आपकी क्लास लोड हो जाती है।

चूंकि आप चाहते हैं कि वेरिएबल को संसाधन स्ट्रिंग से आरम्भ किया जाए तो यह स्थिर नहीं हो सकता। यदि आप इसे स्थिर करना चाहते हैं तो आप इसे स्ट्रिंग मान से आरंभ कर सकते हैं।

आप स्थैतिक चर का संदर्भ गैर-स्थिर विधि से नहीं कर सकते। इसे समझने के लिए, आपको स्थिर और गैर-स्थिर के बीच का अंतर समझने की आवश्यकता है

स्थैतिक चर वर्ग चर होते हैं, वे केवल एक ही उदाहरण के साथ कक्षा से संबंधित होते हैं, जो केवल पहले ही बनाया गया था। गैर-स्थिर चर हर बार जब आप वर्ग के एक ऑब्जेक्ट बनाते हैं तो इनिशियलाइज़ किया जाता है।

अब आपके प्रश्न पर आते समय, जब आप नया () ऑपरेटर का उपयोग करते हैं तो हम प्रत्येक ऑब्जेक्ट के लिए हर गैर-स्थिर दायर की प्रतिलिपि बनाते हैं, लेकिन यह स्थिर फ़ील्ड के लिए मामला नहीं है। यही कारण है कि यदि आप एक स्थैतिक चर गैर-स्थिर विधि से संदर्भित कर रहे हैं, तो यह संकलन समय त्रुटि देता है।

यह प्रश्न नये और मौजूदा उत्तर कुछ अच्छा सैद्धांतिक पृष्ठभूमि नहीं देते हैं। मैं सिर्फ एक अधिक व्यावहारिक उत्तर जोड़ना चाहता हूं।

GetText संदर्भ सार वर्ग की एक विधि है और इसे कॉल करने के लिए, इसके लिए उप-वर्ग (गतिविधि, सेवा, अनुप्रयोग या अन्य) का उदाहरण आवश्यक है। समस्या ये है, कि संदर्भ के किसी भी उदाहरण से पहले सार्वजनिक स्थिर अंतिम चर को आरंभ किया जाता है।

इस को हल करने के कई तरीके हैं:

  1. स्थैतिक संशोधक को निकालने और इसे कक्षा शरीर के भीतर रखकर गतिविधि का एक सदस्य चर (क्षेत्र) या संदर्भ के अन्य उपवर्ग बनाओ;
  2. इसे स्थिर रखें और प्रारंभिक बिंदु को बाद के बिंदु पर देरी (उदाहरण के लिए onCreate विधि में);
  3. इसे वास्तविक उपयोग के स्थान पर एक स्थानीय चर बनाएँ।

आप एक स्थिर चर को प्रारंभ करने के लिए एक गैर-स्थिर विधि का उपयोग नहीं कर सकते।