2011-07-07 16 views
6

एक विधि भरता है/एक वस्तु को संशोधित करता है, यह वस्तु वापस जाने के लिए बेहतर होगा या वापसी के रूप में शून्य टाइप रखने के लिए और विधि अपने संदर्भ के माध्यम से वस्तु को संशोधित करेगा ?वस्तु लौट जावा/वस्तु (कोडिंग दिशा-निर्देश) को संशोधित

public Obj populate(Obj o) 
{ 
.... 
return o; 
} 

public void populate(Obj o) 
{ 
.... 
} 

मुझे पता है कि यह एक मामूली सवाल है, लेकिन कौन सा सबसे पसंदीदा है?

+0

मेरे लिए '' 'वापसी ओ' 'कथन इसके आपके कार्यान्वयन से निर्भर करता है। रेफरी द्वारा ऑब्जेक्ट पास करने से ऑब्जेक्ट को स्टैक में संशोधित किया जाएगा। मेरे लिए '' 'वापसी ओ' 'कथन की आवश्यकता नहीं है। – glg

+0

http://stackoverflow.com/questions/40480/is-java-pass-by-reference –

उत्तर

2

मैं आपकी शैली पर निर्भर करता हूं, लेकिन लौटने का एक फायदा: आप populate(o).doSomethingElse(); पर कॉल कर सकते हैं, यानी आप चेन विधि कॉल कर सकते हैं।

StringBuilder कि उदाहरण के लिए, जो इस new StringBuilder().append("a").append("b")....

+2

StringBuilder अपने तर्क वापस नहीं करता है। यह खुद लौटता है। –

+1

नोट: यह ओपी के लिए तर्क वापस लौट रहा है, न कि जिस तरह से विधि घोषित करता है। –

1

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

संक्षेप में, मैं इसे और अधिक लचीला देखता हूं।

0

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

public Obj populate(Obj o) 
{ 
    Obj returnObj = o.clone(); 
    .... 
    return returnObj; 
} 

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

0

ऑब्जेक्ट this ऑब्जेक्ट को संशोधित करना और बहस अपरिवर्तित छोड़ना बेहतर है।

class ModifiedType { 
    public ModifiedType populate(UnmodifiedType arg) { 
     return this; 
    } 
    // or 
    public void populate(UnmodifiedType arg) { 

    } 
} 

स्ट्रिंगबिल्डर को उदाहरण के रूप में देखें। क्योंकि यह पहले एक से स्पष्ट नहीं है कि वे वापस लौटे और पारित कर दिया वस्तुओं ही हैं, और मैं इसे सामान्य एक दिए गए मान अनदेखी करने के लिए नहीं मिलता

0

दूसरा एक, कम मेरे लिए भ्रामक है।

2

मैं आम तौर पर Command-Query separation के साथ जाऊंगा।

यह कहना है कि यदि विधि तर्क को बदलती है, तो उसे तर्क भी वापस नहीं करना चाहिए।

हालांकि (ऊपर दिए गए विकिपीडिया लेख में उल्लिखित) स्थितियां हैं जहां इस सामान्य सिद्धांत का उल्लंघन करना उचित है।

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