2011-11-01 8 views
44

मेरे पास एक संग्रह है। WeakReference की सिंक्रनाइज़लिस्ट, _components;जावा में, सिंक्रनाइज़ ब्लॉक के भीतर वापसी मूल्य खराब शैली की तरह लगता है। क्या यह वास्तव में मायने रखता है?

मैं निम्नलिखित की तरह कुछ लिखा है, उम्मीद कर शिकायत करने के लिए संकलक:

public boolean addComponent2(Component e) { 
    synchronized (_components) { 
     return _components.add(new WeakReference<Component>(e)); 
    }   
} 

लेकिन संकलक पूरी तरह से संतुष्ट है। ध्यान दें कि List.add() सत्य लौटाता है। तो ठीक है, सिंक्रनाइज़ ब्लॉक से कोई भी निकास लॉक जारी करता है, लेकिन क्या यह अजीब लग रहा है? यह एक लूप में वापसी का उपयोग करने के समान, ब्लॉक में "छेद" की तरह है।

क्या आप इस तरह के कोड को बनाए रखने में खुश रहेंगे?

उत्तर

52

यह बिल्कुल ठीक है - जैसा कि लूप से लौट रहा है, या try ब्लॉक से उपयुक्त finally ब्लॉक है। आपको केवल अर्थशास्त्र के बारे में पता होना चाहिए, जिस बिंदु पर यह सही समझ में आता है।

यह निश्चित रूप से यह की खातिर एक स्थानीय चर शुरू करने से अधिक आसान कोड है: बहुत वैसे भी अब और

// Ick - method body is now more complicated, with no benefit 
public boolean addComponent2(Component e) { 
    boolean ret; 
    synchronized (_components) { 
     ret = _components.add(new WeakReference<Component>(e)); 
    } 
    return ret; 
} 
+1

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

+3

@corsiKa: भविष्य के लिए केवल लाभ है * यदि * उस परिवर्तन की आवश्यकता है। यदि इसकी आवश्यकता नहीं है, तो यह उस कोड को * पढ़ने * बनाता है जो पूरे समय थोड़ा कठिन होता है, आईएमओ। –

38

synchronized ब्लॉक के अंदर लौटने में कुछ भी गलत नहीं है। लॉक सही ढंग से जारी किया जाएगा।