2010-01-20 1 views
6

में अंतिम चर और सिंक्रनाइज़ ब्लॉक अंतिम चर क्या है? (यदि मैं फ़ंक्शन में final int temp ; लिखता हूं तो इसका अर्थ क्या है?)
किस लक्ष्य के लिए अंतिम चर (दोनों वर्ग परिवर्तनीय और फ़ंक्शन वेरिएबल) का उपयोग करें?
क्यों सिंक्रनाइज़ ब्लॉक में परिवर्तनीय अंतिम घोषित करना चाहिए?जावा

+0

अंतिम चर के वारिस नहीं है – SjB

+10

@ sb2367: मुझे लगता है कि आप अंतिम वर्गों के साथ भ्रमित हो रहे हैं, जो कर सकते हैं ' टी subclassed हो। –

उत्तर

14

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

स्थानीय परिवर्तनीय फ़ाइनल बनाने का प्राथमिक कारण यह है कि आप इसे अज्ञात आंतरिक कक्षा में उपयोग कर सकते हैं ... इसका सिंक्रनाइज़ ब्लॉक में होने के साथ कुछ लेना देना नहीं है।

अंतिम चर अपरिवर्तनीय कक्षाएं, बेशक के लिए उपयोगी होते हैं - और अचल जीवन एक मल्टी-थ्रेडेड वातावरण में आसान बना देता है - लेकिन यह है कि दो कि मैं के बारे में सोच सकते हैं के बीच केवल संबंध है ...

संपादित करें: Wildwezyr की टिप्पणी परिवर्तनीय को बदलने के संदर्भ में समझ में आता है जिस पर आप सिंक्रनाइज़ कर रहे हैं। वह खतरनाक होगा, कारणों के कारण। क्या आप "सिंक्रनाइज़ ब्लॉक में चर" से क्या मतलब है?

+2

क्या आपने कभी यह चेतावनी देखी है: "गैर-अंतिम फ़ील्ड पर सिंक्रनाइज़ेशन"? – WildWezyr

+0

@WildWezyr: मैंने नहीं किया है, लेकिन मुझे समझ में आता है कि ऐसा क्यों होगा। –

+0

आप फाइनल के बीच छोटे लेकिन महत्वपूर्ण अंतर पर स्पष्टता के लिए [यहां] पोस्ट कर सकते हैं [http://stackoverflow.com/questions/1249917/final-variable-manipulation-in-java?rq=1) वस्तु और एक अंतिम आदिम। – HardcoreBro

4

जोन स्कीट ने जो कहा, उसके अलावा, मूल्य बदला नहीं जा सकता है लेकिन सामग्री बदला जा सकता है।

final Integer one = new Integer(1); 
... 
one = new Integer(2); // compile error 

final List list = new ArrayList(); 
... 
list = new ArrayList(); // compile error 
list.add(1); // Changes list, but that's fine! 

यह भी ध्यान रखें कि अंतिम और स्थिर अंतिम समान नहीं हैं। अंतिम उदाहरण के दायरे में है, जबकि स्थिर अंतिम एक वर्ग के सभी उदाहरणों के लिए समान है (अन्य भाषाओं में इसे निरंतर कहा जा सकता है)।

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

13

अंतिम चर और सिंक्रनाइज़ कोड ब्लॉक आम में कुछ है ... तुम गैर अंतिम चर a घोषित और फिर synchronized (a) { System.out.println('xxx'); } आप "गैर अंतिम मैदान पर तुल्यकालन" चेतावनी मिल जाएगा लिखते हैं - कम से कम NetBeans में।

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

गैर अंतिम मैदान पर सिंक्रनाइज़ करने की वजह से वास्तविक जीवन मुसीबत से उदाहरण के लिए यहाँ देखो: http://forums.sun.com/thread.jspa?threadID=5379204