2012-05-02 1 views
5

पर अनुवाद के लिए जावा के "अंतिम" को समझना मैं जावा प्रोग्रामर नहीं हूं। मैंने "अंतिम" पर प्रलेखन पढ़ा है, और इसका अर्थ यह है कि "एक चर का मान एक बार और केवल एक बार सेट किया जा सकता है।"सी #

मैं कुछ जावा से सी # का अनुवाद कर रहा हूं। कोड अपेक्षित के रूप में निष्पादित नहीं करता है। मैंने यह पता लगाने की कोशिश की कि क्यों, और अंतिम के कुछ उपयोग पाए गए जो समझ में नहीं आते हैं।

कोड स्निपेट 1:

final int[] PRED = { 0, 0, 0 }; 
... 
PRED[1] = 3; 

विल pred [1] हो 0 या 3?

कोड स्निपेट 2:

final int[] PRED = new int[this.Nf]; 
for (int nComponent = 0; nComponent < this.Nf; nComponent++) { 
    PRED[nComponent] = 0; 
} 
... 
PRED[1] = 3; 

निश्चित रूप से pred [0] 0 के रूप में रहेगा?

+1

है कि यहाँ बाहर की कोशिश करो, जावा का चयन करें, उसके बाद नमूना: http://ideone.com/ –

+0

वाह, यह संसाधन लिंक के लिए धन्यवाद! – IamIC

उत्तर

6

शामिल होंगे मुझे लगता है कि आप में से एक गलतफहमी है final कीवर्ड अर्थ जब यह जावा में सरणियों लिए आवेदन किया है।

दोनों जावा उदाहरणों में सरणी अपरिवर्तित बनी रहेगी, लेकिन उनके तत्व बदला जा सकता है। आपके सभी असाइनमेंट सही तरीके से निष्पादित किए जाएंगे, और सरणी में संग्रहीत मान बदले जाएंगे।हालांकि, अगर आप

final int[] PRED = new int[this.Nf]; 
// some other code 
PRED = new int[123]; // <<== Compile error 

आपको संकलन त्रुटि देखने जा रहे हैं।

जब सी # करने के लिए अपने कोड का अनुवाद करते समय आप अनुवाद करना (जब यह एक class लिए आवेदन किया है) final या तो के रूप में sealed, या के रूप readonly (जब यह एक सदस्य के लिए लागू किया जाता है) की आवश्यकता हो सकती। सी # और final जावा में सरणी readonly एरेज़ समान हैं: आपका प्रोग्राम सरणी को पुन: असाइन नहीं कर सकता है, लेकिन यह अपने तत्वों को स्वतंत्र रूप से संशोधित कर सकता है।

अंत में, जावा-विशिष्ट केस होता है जब final का उपयोग किया जाता है जहां आपको सी # में इसकी आवश्यकता नहीं होती है: जब आपको जावा में किसी अज्ञात स्थानीय कक्षा की विधि के अंदर एक चर का उपयोग करने की आवश्यकता होती है, तो आपको बनाना होगा वह चर final। चूंकि सी # में अज्ञात स्थानीय वर्ग नहीं हैं, इसलिए आपको किसी अन्य चीज़ के साथ कोड के उस टुकड़े का अनुवाद करना होगा, शायद अज्ञात प्रतिनिधियों के साथ। ऐसे प्रतिनिधि केवल पढ़ने योग्य चर का उपयोग करने के लिए प्रतिबंधित नहीं हैं।

+0

मेरा मानना ​​है कि "मुहरबंद" विरासत को रोकता है और उसके पास कोई अन्य कार्य नहीं है। यह "अंतिम" के उपयोग के समान कैसे होगा? – IamIC

+1

जावा में आप अपनी कक्षा 'अंतिम' को उसी तरीके से घोषित करके विरासत को रोक सकते हैं जिस तरह से आप सी # में कक्षा को "सील" करते हैं। यही कारण है कि मैंने उल्लेख किया कि जावा में 'अंतिम' कीवर्ड का अर्थ उस संदर्भ पर निर्भर है जिसमें इसका उपयोग किया जाता है। – dasblinkenlight

+0

ठीक है, मैं समझता हूँ। बहुत धन्यवाद। – IamIC

1

यदि आप एक बार केवल एक बार सेट करना चाहते हैं, हालांकि जावा में अंतिम रूप से सी #, या कॉन्स में पढ़ने के बजाय, या कुछ मामलों में मुहरबंद उपयोग किया जाना चाहिए, हालांकि संभवतया संभवतः बेहतर पढ़ना चाहिए यदि आप केवल पढ़ना चाहते हैं;)

+0

मैं केवल जावा की व्याख्या करने के तरीके को समझने की कोशिश कर रहा हूं :) – IamIC

+0

आपने प्रश्न पर एक सी # टैग डाला है, इसलिए मैंने सोचा कि आप सी # जवाब चाहते हैं;) – RhysW

+0

कोई चिंता नहीं।लेकिन हाँ, मैं सी # में अनुवाद कर रहा हूं, इसलिए मैंने दोनों को टैग किया है :) – IamIC

3

शब्द आप सी # में तलाश कर रहे हैं "स्थिरांक" है:

const int SOMETHING = 10; 

ध्यान दें कि आकार के साथ-साथ लगातार होना चाहिए।

इसके अलावा, स्थिरांक केवल int, bool, string, char, आदि प्रकार (केवल मूल प्रकार) के प्रकार हो सकते हैं।

तो अगर आप इस तरह के एक सरणी या एक वर्ग के रूप में कुछ और, चाहते हैं, आप कर सकते हैं:

static readonly int[] PRED = new int[this.Nf]; 

स्टेटिक केवल पढ़ने के लिए वास्तव में स्थिरांक का मतलब है, तार्किक रूप से, को छोड़कर इसे दूसरे तरीके से मंच के पीछे एक छोटे से परिभाषित किया गया है, जो आप की अनुमति देता है इसके साथ अधिक स्वतंत्र रूप से खेलने के लिए। (जब आप कर सकते हैं - आप स्थिर केवल पढ़ने के के बजाय स्थिरांक परिभाषित करना चाहिए)

सरणी ही चलाने के दौरान परिवर्तन नहीं होगा, तो आप ऐसा करने में सक्षम नहीं होगा:

PRED = new int[3]; // Error 
PRED = null; // Error 
PRED = PRED; // Error 

लेकिन आप मूल्यों को बदल सकते pred सरणी अंदर:

PRED[0] = 123; 

आप एक केवल पढ़ने के लिए संग्रह करना चाहते हैं, तो आप ReadOnlyCollection वस्तु का उपयोग कर सकते हैं! तो आप उस ऑब्जेक्ट निरंतर होना चाहते हैं, तो आप स्थिर-केवल पढ़ने के संयोजन का उपयोग कर सकते हैं (आप निरंतर उपयोग नहीं कर सकते, क्योंकि यह एक वर्ग है), और आप मिल जाएगा:

static readonly ReadOnlyCollection<int> PRED = new ReadOnlyCollection<int>(new[] {1, 2, 5, 6}); 

और फिर pred हमेशा होगा pred सकता है, और हमेशा आकार 4 की हो जाएगा, और हमेशा 1, 2, 5, 6.

PRED = PRED; // Error (static readonly) 
PRED = null; // Error (static readonly) 
PRED[1] = 0; // Error (ReadOnlyCollection enforces readonly on the elements) 

int i = PRED[1]; // Still works, since you aren't changing the collection. 
+0

अगर मुझे गलत लगता है तो मुझे सही करें, लेकिन आपका उत्तर दूसरों से भिन्न होता है। विशेष रूप से, @dasblinkenlight कह रहा है कि मान बदल सकते हैं, जो एक कॉन्स या रीडोनली का उल्लंघन करेगा। – IamIC

+0

सरणी स्वयं कभी नहीं बदलेगी, लेकिन इसमें इसके मूल्य बदल सकते हैं। जैसे ही आप एक स्थिर रीडोनली MyClass को परिभाषित कर सकते हैं, फिर भी इसकी गुणों को बदलें। संपादन देखें। – SimpleVar

+0

@YoryeNathan निरंतर संबंधित है, जो काम नहीं करता है, समय त्रुटि संकलित करें। इसे जांचें: http://ideone.com/G7Ven –

1

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

2

फ़ाइनल को संकलक द्वारा चेक किया गया है, रनटाइम पर नहीं। तो यदि असाइनमेंट PRED[1] = 3 अमान्य था, तो यह संकलक द्वारा पकड़ा जाएगा और कोड संकलित भी नहीं होगा।

यह असाइनमेंट मान्य है, क्योंकि अंतिम माध्यम: आप चर के लिए एक और मान पुन: असाइन नहीं कर सकते हैं। इसका मतलब यह नहीं है: आप चर द्वारा संदर्भित ऑब्जेक्ट को म्यूटेट नहीं कर सकते हैं।

उपर्युक्त असाइनमेंट PRED के मान को संशोधित नहीं करता है। यह PRED[1] के मान को संशोधित करता है। यदि PRED एक सूची थी, तो समतुल्य PRED.set(1, 3) होगा। जो ठीक है PRED = new ArrayList<Integer>() गलत क्या होगा।

1

जावा अंतिम कीवर्ड जावा प्रोग्रामिंग भाषा में विभिन्न स्थितियों के तहत प्रयोग किया जाता है और इसके अलग-अलग प्रभाव होते हैं। उदाहरण के लिए:

  1. एक निरंतर चर घोषित करने के लिए,
  2. एक निरंतर विधि पैरामीटर की घोषणा करने के लिए।

    1. अंतिम रूप में घोषित एक चर को इसके उपयोग से पहले प्रारंभिक होना चाहिए। इस चर को एक नया मान असाइन नहीं किया जा सकता है जैसे कि (ए = बी)। लेकिन यदि चर प्राचीन प्रकार का नहीं है तो इसकी गुण सेट विधियों या किसी अन्य सार्वजनिक फ़ील्ड का उपयोग करके सेट किया जा सकता है। इसका अर्थ यह है कि ऑब्जेक्ट इंस्टेंस संदर्भ को बदला नहीं जा सकता है लेकिन ऑब्जेक्ट इंस्टेंस के गुण तब तक बदला जा सकता है जब तक कि उन्हें स्वयं को अंतिम घोषित नहीं किया जाता है।

    2. उस विधि में संशोधित पैरामीटर को प्रतिबंधित करने के लिए जहां इसका उपयोग किया जा रहा है।

+0

बहुत अच्छी तरह से समझाया, धन्यवाद। – IamIC