2012-01-26 7 views
5

पैरामीटर के रूप में पारित किया गया वही ऑब्जेक्ट लौटा रहा है, निम्न कोड में, क्या यह पैरामीटर के रूप में लिया गया वही ऑब्जेक्ट वापस करने के लिए updateWithContex के लिए वास्तव में खराब अभ्यास है?जावा प्रैक्टिस: पैरामीटर

class SomeClass{ 
    Foo updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
     return foo; 
    } 
} 

class Foo{ 

    public void setAppId(int appId) 
    { 
     // 
    } 
    public void setXId(int appId) 
    { 
     // 
    } 
    public void changeState(X x) 
    { 
     // 
    } 
} 

सी ++ में, मैं इस तरह कोड को देखा है:

BigObject& 
    fastTransform(BigObject& myBO) 
    { 
     // When entering fastTransform(), myBO is the same object as the function 
     // argument provided by the user. -> No copy-constructor is executed. 
     // Transform myBO in some way 
     return myBO; // Transformed myBO is returned to the user. 
    } 

यह भी गलत है?

+2

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

+0

@buc: सही, अच्छा बिंदु। मैं बहुत तेज़ था, फिर –

उत्तर

9

किसी ऑब्जेक्ट को लौटने से आपके एबीआई के उपयोगकर्ताओं को सुझाव मिलेगा कि पारित ऑब्जेक्ट को बदला नहीं जाएगा और इसके बजाय एक नया संशोधित ऑब्जेक्ट लौटाया जाएगा। यह स्पष्ट करने के लिए कि यह मामला नहीं है, मैं वापसी प्रकार को void में बदलने का सुझाव दूंगा।

+0

यह समझ में आता है! लेकिन क्या यह मूल रूप से गलत है? या यह कोड की सिर्फ पठनीयता है? – yadab

+2

यह निर्भर करता है कि आप "मौलिक रूप से गलत" कैसे परिभाषित करते हैं ... क्या यह विधि का उपयोग करना असंभव है? नहीं। क्या आपका नाम किसी और द्वारा शाप दिया जाएगा जिसे आपकी विधि को कॉल करना है? शायद! – vaughandroid

+0

@vaughandroid तब इसे संभालने का बेहतर तरीका क्या है? – user11235813

2

आपका कोड इस तरह दिखना चाहिए:

class SomeClass{ 
    void updateWithContex(Foo foo){ 
     foo.setAppId(i); 
     foo.setXId(index); 
     //..... 
    } 
} 

यह बुरी बात है, क्योंकि आप foo वस्तु के संदर्भ में पारित, ताकि आप इसे विधि लौटने वापस बिना updateWithContex विधि में बदल सकते हैं। एक बार और, याद रखें कि आप जावा के संदर्भ में हमेशा काम करते हैं। और निश्चित रूप से, इसे कहीं और करने का कोई तरीका नहीं है - यह हमेशा किसी ऑब्जेक्ट का संदर्भ होगा। जावा में ऐसा कुछ नहीं है: फास्ट ट्रान्सफॉर्म (BigObject & myBO)।

+0

Fwiw, मुझे उम्मीद है कि अद्यतन WithContext निजी है, और इस हद तक वापसी का प्रकार अति-महत्वपूर्ण नहीं है। यदि आपके पास सार्वजनिक विधियां हैं जो फू की आंतरिक स्थिति को संशोधित करती हैं, तो मैं इन्हें फू के शून्य सदस्यों के रूप में घोषित करता हूं। –

+0

मुझे पता है कि जावा संदर्भ कैसे काम करता है, यही कारण है कि मैंने आवश्यकता को स्पष्ट करने के लिए सी ++ रेफरी की आपूर्ति की है। मेरा सवाल है: समान फू वापस करना गलत क्यों है। जब हम असेंबली के साथ प्रोग्राम करते हैं तो वही रजिस्ट्री परिवर्तन होता है और वापस धक्का दिया जाता है, जावा में क्यों नहीं? – yadab

+0

@Savino Sguera - UpdateWithContext पैकेज निजी है। –

2

मुझे कुछ भी गलत नहीं दिख रहा है, यह एपीआई डिज़ाइन का मामला है। कोड के साथ आप आप की तरह

someClass.updateWithContext(new Foo()).changeState(x); 
बजाय

Foo foo = new Foo(); 
someClass.updateWithContext(foo); 
foo.changeState(x); 

पहले कोड स्निपेट दूसरा एक से fluent interface का एक बेहतर उदाहरण है कुछ कर सकते हैं पोस्ट किया है।

+0

धन्यवाद! लेकिन मेरा मामला जो आपने उत्तर दिया है उससे थोड़ा अलग है (विधि चेनिंग मेरी समस्या नहीं है)। – yadab

1

Output Parameters in Java कुछ ऑब्जेक्ट्स कुछ अपरिवर्तनीय हैं। इस तरह के तरीकों की धागा सुरक्षा भी संदिग्ध है। यह किया जा सकता है लेकिन हां इसे आमतौर पर आउटपुट जावा पैरामीटर के लिए अच्छी चीज और Google नहीं माना जाता है। उम्मीद है की यह मदद करेगा।

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