2016-04-15 14 views
6

में बदल नहीं रहा है मेरे पास एक परिदृश्य है जहां मैं Boolean ऑब्जेक्ट सेट करना चाहता हूं और उसके बाद विधि में बाद में एक निर्माता में booleanValue() का उपयोग करना चाहता हूं। हालांकि, जिस दायरे में वस्तु सेट की गई है वह अलग है। यह विधि द्वारा बुलाए गए तरीके में सेट किया गया है जिसमें ऑब्जेक्ट पहली बार तत्काल है। जावा कैसे प्राचीन और ऑब्जेक्ट तर्कों को पार करता है और ऑनलाइन पोस्ट (जैसे this) को पढ़ने के बारे में मेरी समझ के आधार पर, जब कोई ऑब्जेक्ट किसी विधि में पारित होता है, तो इसकी गुण संदर्भ द्वारा पारित की जाती है और बुलाए गए विधि में किसी भी बदलाव को प्रतिबिंबित किया जाना चाहिए कॉल विधि के बाद कॉलिंग विधि निष्पादन समाप्त हो गया है। हालांकि मैं देख रहा हूं कि जब बुलाया गया तरीका समाप्त हो जाता है, तो कॉलिंग विधि में कोई भी परिवर्तन प्रभावी नहीं होता है। ,जावा बूलियन मान विधि

private CustomObject1 callingMethod(){ 
    Boolean b = Boolean.TRUE; 
    List<CustomObject2> list = this.calledMethod(b); 
    //Create CustomObject1 with b.booleanValue() as one of the arguments in the constructor 
} 

private List<CustomObject2> calledMethod(Boolean b){ 
    ... 
    ... 
    if(condition){ 
     b = Boolean.FALSE; 
    } 
    ... 
    ... 
} 

बार कोड CustomObject निर्माण b.booleanValue() हमेशा सच है पहुँचता है के द्वारा भले ही callingMethod() में अगर-वाक्य सही है और Boolean गलत पर सेट है:

यहाँ मेरी परिदृश्य का एक स्नैपशॉट है उस विधि में।

मैं boolean होने के लिए कॉलिंग विधि के रिटर्न प्रकार को बदलने में अनिच्छुक हूं क्योंकि इसे इस विधि को कॉल करने वाले कोड के अन्य बिट्स में बदलाव की आवश्यकता होगी। वर्तमान में उन्हें केवल हस्ताक्षर परिवर्तन की आवश्यकता है, लेकिन रिटर्न प्रकार परिवर्तन के लिए अधिक काम की आवश्यकता होगी क्योंकि तर्क को बनाए रखने की आवश्यकता है (यानी एक सूची पॉप्युलेट करना और फिर इसके साथ कुछ करना)

उत्तर

14

सबसे पहले, जावा में गुजरने वाले पैरामीटर के बारे में बहुत सारी गलत जानकारी है, जैसे "ऑब्जेक्ट्स संदर्भ द्वारा पारित होते हैं, प्राइमेटिव्स वैल्यू द्वारा पास किए जाते हैं" जो सही नहीं हैसब कुछमूल्य द्वारा पारित किया गया है।

आप जावा में संदर्भ द्वारा एक वस्तु गुजर नहीं कर रहे हैं, तो आप मान द्वारा एक वस्तु संदर्भ गुजर रहे हैं। Boolean b में Boolean ऑब्जेक्ट नहीं है, इसमें Boolean ऑब्जेक्ट में एक संदर्भ (एक पॉइंटर) है। http://javadude.com/articles/passbyvalue.htm

दूसरा, Boolean (अन्य आवरण वस्तुओं की तरह है और यह भी String) अपरिवर्तनीय वस्तुओं रहे हैं:

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

या Apache Commons Lang से MutableBoolean का उपयोग करें।

+1

वह लिंक वास्तव में अंतर्दृष्टिपूर्ण था।मैं किसी भी जावा प्रोग्रामर को प्रोत्साहित करता हूं जो इसे पढ़ने के लिए देखता है। –

2

समस्या यह है कि आप b को कॉलम में पुनः निर्दिष्ट कर रहे हैं। कॉलम में पुन: असाइनमेंट केवल उस विधि की पैरामीटर सूची में घोषित वैरिएबल को पुन: असाइन करता है; यह कॉलर के दायरे में घोषित वैरिएबल को संशोधित नहीं करता है।

जो आप प्राप्त करना चाहते हैं, उसे करने के लिए, आप या तो b को किसी फ़ील्ड में परिवर्तित कर सकते हैं, या एक MutableBoolean क्लास बना सकते हैं जो आपको b.setValue(false) जैसे कुछ करने की अनुमति देता है।

+0

क्यों बी को किसी फ़ील्ड में कनवर्ट करना विधि में विधि परिवर्तन को कॉल करने में बी बना सकता है? – user1169587

+1

यदि आप 'b' को किसी फ़ील्ड में कनवर्ट करते हैं (यानी, यह अब पैरामीटर नहीं है लेकिन कॉल विधि के लिए दृश्यमान है), कॉलिंग विधि और कॉल विधि दोनों एक ही चर के संदर्भ में हैं; जबकि यदि 'बी' पैरामीटर है, तो कॉलिंग विधि और कॉल विधि 2 अलग-अलग चर संदर्भित कर रही है। – rob

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