2011-03-09 15 views
8

क्या ऑब्जेक्ट 1 और 2 में आदिम मान को गुजरने के दौरान पूरे ऑब्जेक्ट को पास करने में ओवरहेड या प्रदर्शन समस्या है?पूर्ण ऑब्जेक्ट बनाम प्राइमेटिव वैल्यू पास करना -

[संपादित करें: मेरा मतलब जावा ऑब्जेक्ट बनाम आदिम प्रकार के संदर्भ को पार करना है। @ टीजे से। पाउडर, मैं समझता हूं कि यहां कोई प्रदर्शन समस्या नहीं है क्योंकि वस्तु संदर्भ आकार दोनों मामलों में समान है। लेकिन एपीआई डिजाइन शैली/परिप्रेक्ष्य के अंतर, जो विकल्प सबसे अच्छा है? ]

मैं वर्तमान में सेवा परत को परिभाषित कर रहा हूं। मैं पसंद "टाइप 1" के रूप में मैं इसे, चाहते लेकिन अगर 'टाइप 2' प्रदर्शन के लिए अच्छा है, मैं प्रकार 2.

Class A { 
    User user = SomeClass.getUser("anUser"); 

    B b = new B(); 

    b.doSomeOperation(user); // option 1 
    b.doSomeOperation(user.getUserId()); // option 2 
} 

Class B { 

    // Type 1 
    public void doSomeOperation(User user){ 

     // some work done by using user.getUserId() 
     // I do not really need whole user object now. 
    } 

    // Type 2 
    public void doSomeOperation(int userId){ 
     // some work done by userId 
    } 
} 
+0

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

उत्तर

16

के साथ जाने के लिए आप जावा में एक "पूरी वस्तु" पारित कभी नहीं होगा। क्या पास हो जाता है एक संदर्भ है, जो int या उसके आकार के आकार के बारे में है। तो आप   — किसी ऑब्जेक्ट संदर्भ या int आईडी   — को फ़ंक्शन पर कॉल के संदर्भ में प्रदर्शन पर कोई प्रभाव नहीं पड़ता है।

हालांकि, ऑब्जेक्ट संदर्भ को पार करने का अर्थ है कि आप सीधे ऑब्जेक्ट पर कार्य कर सकते हैं, जबकि आईडी पास करने का अर्थ है कि यदि आपको ऑब्जेक्ट तक पहुंचने की आवश्यकता है, तो आपको आईडी द्वारा इसे फिर से देखना होगा, जिसका नकारात्मक प्रदर्शन प्रभाव हो सकता है ।


संपादित: अगर आपके अपडेट के आधार पर:

मैं समझता हूँ कि यहाँ कोई प्रदर्शन मुद्दा है कि वहाँ के रूप में वस्तु संदर्भ आकार दोनों ही मामलों में एक ही है। लेकिन एपीआई डिजाइन शैली/परिप्रेक्ष्य के अंतराल, कौन सा विकल्प सबसे अच्छा है?

जो पूरी तरह से प्रश्न को बदलता है (और इसे "प्रदर्शन" भाग पूरी तरह से छोड़ देता है)।

यह पूरी तरह से एक पर निर्भर करता है) आप doSomeOperation में क्या करने जा रहे हैं क्या, और बी) क्या जानकारी कॉल doSomeOperation की सबसे होने की संभावना है।

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

यदि doSomeOperation को उपयोगकर्ता आईडी के अलावा अन्य किसी भी चीज़ की आवश्यकता नहीं है, तो आप शायद आईडी में बस जाना चाहते हैं। व्यापार-बंद हैं। यदि आप केवल int आईडी में गुजरते हैं, तो एक तरफ doSomeOperationUser (जो आमतौर पर अच्छा होता है) पर इसके युग्मन को खो देता है; दूसरी ओर, doSomeOperation का तर्क काफी हद तक व्यर्थ हो जाता है। (एक int कुछ भी हो सकता है, लेकिन User अर्थ नहीं है।)

doSomeOperation एक User तर्क लगता है लेकिन वास्तव में केवल यूजर आईडी की जरूरत है, तो आप doSomeOperation की कॉल करने के लिए एक बोझ डाल रहे हैं तो: वे सिर्फ ID है, तो वे इसे doSomeOperation में पारित करने के प्रयोजनों के लिए पूरी तरह से ऑब्जेक्ट को देखना होगा (जो तब आईडी के अलावा सब कुछ अनदेखा करने जा रहा है)। यह प्रदर्शन परिप्रेक्ष्य से स्पष्ट रूप से खराब है।

तो मुझे लगता है कि सारांश है: यदि doSomeOperation को User की कुछ भी आवश्यकता है, तो बस इसकी आईडी से परे, User में पास करें। अगर इसे केवल आईडी की आवश्यकता है और User से कुछ और की आवश्यकता नहीं है, तो बस आईडी में पास करें।

1
  • यदि आप सुनिश्चित करें कि आप सिर्फ प्रयोक्ता आईडी के अलावा कोई अन्य जानकारी की जरूरत नहीं होगी तो type 2 के लिए जाते हैं अन्यथा 1.

  • अधिक से अधिक आप पूरी वस्तु गुजर नहीं कर रहे हैं, बस संदर्भ के हैं बिट्स की प्रतिलिपि बनाई जाएगी।

  • मान लीजिए कि आप उपयोगकर्ता की doSomeOperation में कुछ जानकारी अपडेट करना चाहते हैं तो आपको उस वस्तु को आईडी का उपयोग करना होगा जो महंगा होगा।

0

यदि आपके पास पहले से ही उपयोगकर्ता ऑब्जेक्ट पास का उदाहरण है। जब आप ऑब्जेक्ट पास करते हैं तो आप केवल स्मृति की चपेट में नहीं आते हैं। यदि आप आईडी पास करते हैं तो आपको शायद डेटाबेस से उपयोगकर्ता को पुनर्प्राप्त करना होगा। वह ऊपरी है।

1

प्रदर्शन बिंदु से, type1 और type2 के बीच कोई महत्वपूर्ण अंतर नहीं है। डिजाइन के दृष्टिकोण से वहाँ है।

एक सामान्य नियम के रूप में, केवल की आवश्यकता है, कुछ भी नहीं और कुछ भी कम नहीं है।

आप User वस्तु अपने doSomeOperationUser वर्ग के लिए युग्मित किया जाएगा के लिए एक संदर्भ पार कर लेते हैं। यह आपको भविष्य में समस्याओं के साथ पेश कर सकता है, जैसे विधि परीक्षण इकाई में कठिनाई आदि।

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