2010-01-17 8 views
46

मैंने पढ़ा है कि जावा static सी/सी ++ के विपरीत स्थानीय चर का समर्थन नहीं करता है। अब अगर मैं स्थानीय चर के साथ एक फ़ंक्शन को कोड करना चाहता हूं, जिसका मान फ़ंक्शन कॉल के बीच जारी रहना चाहिए, तो मैं यह कैसे कर सकता हूं?
क्या मुझे इंस्टेंस चर का उपयोग करना चाहिए?मैं जावा में एक स्थिर स्थानीय चर कैसे बना सकता हूं?

+0

यही कारण है कि जावा को बंद करने की आवश्यकता है (मजाक)। –

+0

@ डैरेन: स्थिर स्थानीय लोगों के साथ क्या बंद करना है? – missingfaktor

+9

वह कई फ़ंक्शन कॉल के माध्यम से राज्य को बनाए रखने के लिए स्थिर स्थानीय (एक सी समझ में) चाहता था। दूसरे शब्दों में फ़ंक्शन रिटर्न के बाद स्थानीय लोग मौजूद हैं। यह बंद करने का एक उपयोग है। –

उत्तर

29

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

public class Foo { 
    static int bar; 
    //set bar somewhere 

    public int baz() { 
     return 3 * bar; 
    } 
} 
+7

मुझे लगता है कि ज्यादातर मामलों में * इंस्टेंस वैरिएबल * ठीक होना चाहिए, अगर @gameover चाहता है तो विधि स्थिर स्थानीय चर को प्रतिस्थापित करने के लिए कुछ है। – bryantsai

+0

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

+5

@EllieP देता है। 'पिछली बार ++;' – Cruncher

4

Should I resort to using instance variables?

हाँ - आखिरकार, यह उदाहरण चर के लिए है। वे वस्तु को वस्तुओं के तरीकों के आविष्कार के बीच स्टोर करते हैं। स्थैतिक वर्ग चर होने के परिणामस्वरूप एक ही परिणाम प्राप्त हो सकता है, लेकिन आपके प्रोग्राम को अधिक युग्मित और परीक्षण/नकली/बनाए रखने के लिए कठिन बना सकता है।

4

आप समारोह कॉल के बीच चर मूल्य का पुन: उपयोग और अन्य तरीकों से इस चर को अलग करना चाहते हैं, आप एक वस्तु में यह संपुटित चाहिए। सबसे पहले, केवल "स्थैतिक की तरह" चर के साथ एक वर्ग को परिभाषित करने और समारोह की जरूरत:

class MyFunctionWithState { 
    private int myVar = 0; 
    public int call() { 
     myVar++; 
     return myVar; 
    } 
} 

फिर, अपने ग्राहक कोड से:

class Foo { 
    private MyFunctionWithState func = new MyFunctionWithState(); 
    public int bar() { 
     return func.call(); 
    } 
} 
अब

अगर func की आंतरिक स्थिति पर निर्भर करता है Foo आप call() के माध्यम से प्रासंगिक डेटा पास या तो कर सकते हैं या Foo का एक उदाहरण गुजरती हैं और समारोह उचित ही टिककर खेल कॉल:

class MyFunctionWithState { 
    private int myVar = 0; 
    public int call(Foo f) { 
     myVar += f.getBaz(); 
     return myVar; 
    } 
} 

class Foo { 
    private MyFunctionWithState func = new MyFunctionWithState(); 
    public int bar() { 
     return func.call(this); 
    } 
    public int getBaz() { /*...*/ } 
} 
+0

यह इतना जटिल क्यों होना चाहिए? जावा भाषा या फीचर के कुछ हिस्से के साथ एक सदस्य समारोह संघर्ष में स्थिर int myVar रखता है? मैं इस बात से सहमत नहीं हूं कि इस प्रकार के कुछ भी चाहते हैं। हो सकता है कि मुझे एक चर की स्थिति को रखने के लिए कुछ फ़ंक्शन चाहिए और मैं कक्षा के भीतर अन्य सभी फ़ंक्शंस को उस चर तक पहुंच नहीं लेना चाहता हूं। चर के पास यह कहां उपयोग किया जाता है कि यह कहां उपयोग किया जाता है। मुझे लगता है कि मैं फ़ंक्शन के ऊपर वैरिएबल दाएं स्थान रख सकता हूं, लेकिन यह तब भी भ्रम पैदा करता है जब अन्य फ़ंक्शंस समान वैरिएबल नाम का उपयोग कर रहे हों। – user1164199

+0

जब मैंने कहा "जावा भाषा या फीचर के कुछ हिस्से के साथ एक सदस्य समारोह में स्थिर int myVar रखता है?", मेरा मतलब था "क्या भविष्य में जावा संस्करण में इस भाषा की सुविधा को जोड़ना संभव होगा?" – user1164199

5

स्थानीय चर एक विधि के अंदर चर हैं। इन चरों तक पहुंचने के लिए केवल विधि ही मिलती है। आपके पास स्थैतिक स्थानीय चर नहीं हो सकता है, लेकिन आप इंस्टेंस चर या कक्षा चर का उपयोग कर सकते हैं।

यदि आपके पास स्थैतिक के रूप में आपकी विधि है जो डिफ़ॉल्ट रूप से इस विधि की एक प्रतिलिपि बनाता है तो सभी ऑब्जेक्ट्स को कॉपी नहीं किया जा सकता है और स्थानीय चर को केवल उस विधि तक सीमित नहीं किया जा सकता है, जिसमें वे रहते हैं।

-3

अंतिम int intVar = 1; // केवल एक बार में प्रवेश किया जाएगा। विधि में सी ++ स्थैतिक स्थानीय var के रूप में Behaves।

+2

यह एक भ्रामक उत्तर है, क्योंकि इस उदाहरण में 'intVar' एक C++ स्थिर स्थानीय चर की तरह व्यवहार करता है क्योंकि यह निरंतर असाइन किया गया है। जैसे 'शून्य विधि (int arg) में {अंतिम int intvar = arg; ...} ',' intVar' एक C++ स्थिर स्थानीय चर की तरह व्यवहार नहीं करेगा। –

+0

आप अंतिम चर को बढ़ा या घटा नहीं सकते –

-1

निम्न उदाहरण में count बर्ताव करता है एक स्थिर स्थानीय चर की तरह है, कि तुम सी में उपयोग कर सकते हैं:

public class Foo { 

    private int count = 0; 

    public int getCount() { 
     return count++;    
    } 
} 

कोई स्थिर स्थानीय चर अन्य भाषाओं समर्थन की तरह कर रहे हैं। चूंकि जावा बहुत "वर्ग" है-केंद्रित है, यह इसे उस संदर्भ में लाने की कोशिश करता है। यदि आप उस व्यवहार को अनुकरण करना चाहते हैं, तो आप एक आवृत्ति चर का उपयोग करते हैं, जिसका उपयोग केवल इस विधि द्वारा किया जाता है। तो यह अलग-अलग विधि कॉल के लिए स्थिर है, क्लास के लिए नहीं।

+1

एक उदाहरण के लिए स्टेटिक मेरे लिए बहुत स्थिर नहीं है। स्थिर का मुख्य बिंदु ए) कक्षा में वैश्विक मूल्य है। उदाहरण पर निर्भर नहीं है। बी) प्रत्येक उदाहरण के लिए एक चर बनाने से बचें :) – borjab

+0

@borjab: सच है, लेकिन चूंकि ओपी ने लिखा था: 'अब अगर मैं स्थानीय चर के साथ एक फ़ंक्शन को कोड करना चाहता हूं, जिसका मान फ़ंक्शन कॉल के बीच जारी रहना चाहिए, तो मैं यह कैसे कर सकता हूं ? '... स्पष्ट के साथ जवाब देने का अधिकार लग रहा था। स्टेटिक संदर्भ पर कुछ हद तक निर्भर करता है: इस उदाहरण के भीतर समारोह के लिए यह 'स्थैतिक' होगा ... दूसरी तरफ नियमित 'स्थैतिक' कक्षाएं कार्यक्रम के विभिन्न उदाहरणों या यहां तक ​​कि विभिन्न उपकरणों के बीच बहुत स्थिर नहीं हैं ;-) – Levit

0

या तो आपने एक उत्तर सही सही चिह्नित किया है, या आप वास्तव में स्थैतिक वर्ग चर चाहते थे - लेकिन सही उत्तर मूल रूप से लेविट, या तकनीकी रूप से सभी उत्तरों का मिश्रण है।

मेरे जैसे सी पृष्ठभूमि से लोगों के लिए, वास्तव में स्थिर कार्य-स्थानीय चरों को ग्लोबल्स पर दायरे के लाभ के लिए पूरी तरह से चाहते हैं, ऐसा लगता है कि उत्तर जावा में नहीं हो सकता है।@paradigmatic जैसे कुछ किए बिना कुछ स्थिर वर्ग और गेटर() के साथ एक वर्ग के उदाहरण के साथ नहीं जा रहा है, जिसमें आप अपना काम चला रहे वर्ग के उदाहरण के लिए विशिष्ट हैं।

यदि मुझे संदेह है, तो आप ' कक्षा को सिंगलटन के रूप में चला रहे हैं, या पूरी तरह से स्थिर रूप से प्रक्रियात्मक प्रोग्रामर की तरह स्थिर रूप से हम सभी के रूप में शुरू किया गया है, @Ellie P's या @ user2626445 का जवाब ठीक काम करेगा क्योंकि कोई अन्य उदाहरण आपके वैश्विक को खराब नहीं कर रहा है। लेकिन मुझे लगता है कि यह हासिल करने के लिए आप चाहते हैं कि यह वास्तव में केवल एक आवृत्ति चर होना चाहिए, जो सी में वैश्विक है। वे फ़ंक्शन कॉल पर बने रहते हैं लेकिन आपके फ़ंक्शन को ओओ तरीके से उपयोग करने की अनुमति देते हैं, इसलिए कई उदाहरण स्वयं को रख सकते हैं इस विशेष समारोह के लिए लगातार चर।

व्यक्तिगत रूप से, मैं इस के आसपास Jave में उसी तरह मैं समारोह बिट चर की अनुमति नहीं दे चारों ओर उच्च तकनीक सी मिल पाने, बस ऊपर समारोह घोषणा फ़ाइल में वैश्विक घोषणा के द्वारा। इस तरह जब मैं कोड को बाद में हैक करता हूं तो यह सोचने की संभावना कम होती है कि यह एक वैश्विक है और इसके साथ गड़बड़ करने का लुत्फ उठाया जाता है - ऐसा नहीं है कि हम चीजों को कैसे समाहित करते हैं?

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