2010-11-15 9 views
12

मैं एक बैंकिंग मॉडल बना रहा हूं, और एक खाता वर्ग में खाता संख्या क्षेत्र है। खाता संख्या कभी नहीं बदली जानी चाहिए, लेकिन मैं फ़ील्ड को अंतिम रूप में सेट नहीं कर सकता क्योंकि यह निर्माता को इसे स्थापित करने से रोक देगा।क्या इसे घोषित करने के बाद मैं एक चर अंतिम बना सकता हूं?

यदि ऐसा करना संभव नहीं है, तो इससे कोई फर्क नहीं पड़ता। यह केवल एक सीएस असाइनमेंट के लिए है, इसलिए मैं यह सुनिश्चित करना चाहता हूं कि मैं इसे सबसे अच्छा तरीका कर रहा हूं।

क्या सबसे अच्छा कार्यान्वयन केवल क्षेत्र और इसकी सेटर विधि को निजी बनाना होगा?

+4

"यह निर्माता को इसे स्थापित करने से रोक देगा।" क्या अापको उस बारे में पूर्ण विशवास है? http://stackoverflow.com/questions/677595/initialize-final-variable-before-constructor-in-java – kasten

+0

यह बहुत बढ़िया है, आपको नहीं पता था कि आप ऐसा कर सकते हैं: डी – Matt

+0

आप एक निर्माता के भीतर से अंतिम स्थिर चर नहीं बदल सकते , क्योंकि स्थिर चर कई उदाहरणों के लिए एक है। लेकिन अंतिम परिवर्तक कन्स्ट्रक्टर के अंदर शुरू किया जा सकता है। –

उत्तर

23

कन्स्ट्रक्टर इसे सेट कर सकता है यदि इसे final के रूप में चिह्नित किया गया है। निम्नलिखित कानूनी है:

public class BankAccount { 

    private final int accountNumber; 

    public BankAccount(int accountNumber) { 
     this.accountNumber = accountNumber; 
    } 

} 

तथ्य अगर एक क्षेत्र final के रूप में चिह्नित किया गया है, लेकिन इसके घोषणा तो यह सब कंस्ट्रक्टर्स में सेट किया जाना चाहिए में initialised नहीं हैं।

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

+1

यदि आप निजी अंतिम स्ट्रिंग खाते की तरह कुछ घोषित करते हैं तो संख्या = शून्य शिकायतकर्ता शिकायत करेगा। – Todd

+1

@ टोड, सही। एक बार 'शून्य' पर सेट करने के बाद अंतिम चर को पुन: असाइन नहीं किया जा सकता है। हालांकि अगर घोषणा सिर्फ 'निजी अंतिम स्ट्रिंग खाता संख्या' है, तो आप अपने मूल्य को कन्स्ट्रक्टर में असाइन कर सकते हैं। – mikej

+0

टिप्पणी प्रश्नकर्ता के लिए बनाई गई थी। मैंने सोचा कि वह समस्या हो सकती है। – Todd

4

यदि कोई चर final है तो यह (और ) को कन्स्ट्रक्टर में प्रारंभ किया जा सकता है।

+0

तो अगर मैं "निजी अंतिम खाता संख्या" जैसे क्षेत्र की घोषणा करता हूं; और उसके बाद इसे "accountNumber = 1234" जैसे निर्माता में प्रारंभ करें, जो काम करेगा? और मैं केवल कन्स्ट्रक्टर में ऐसा कर सकता हूं? – Matt

+0

हां। सभी फाइनल सभी रचनाकारों में सेट किया जाना चाहिए। –

+4

यह वास्तव में सच नहीं है। एक अंतिम क्षेत्र शुरू किया जा सकता है जहां इसे घोषित किया गया है, उदाहरण के प्रारंभिक ब्लॉक में, या एक कन्स्ट्रक्टर में। एक स्थिर अंतिम क्षेत्र को प्रारंभ किया जा सकता है जहां इसे घोषित किया गया है या स्थिर प्रारंभिक ब्लॉक में। – ColinD

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

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