2010-04-08 7 views
5

(इस प्रश्न के प्रयोजनों के लिए, हम मान लें कि कोई जानबूझकर ऑटो (अन) मुक्केबाजी का उपयोग नहीं कर रहा है, या तो क्योंकि कोई प्री-जावा 1.5 कोड लिख रहा है, या क्योंकि किसी को लगता है कि ऑटोऑनबॉक्सिंग NullPointerException एस बनाने में बहुत आसान बनाता है ।)कोई भी बुलीयन और इसी तरह के अपरिवर्तनीय वर्गों पर सार्वजनिक रचनाकारों का उपयोग क्यों करना चाहेगा?

उदाहरण के लिए Boolean लें। Boolean(boolean) कन्स्ट्रक्टर के लिए प्रलेखन कहता है:

नोट: यह कन्स्ट्रक्टर का उपयोग करने के लिए शायद ही कभी उचित है। जब तक नया उदाहरण आवश्यक है, स्थिर कारखाना valueOf(boolean) आमतौर पर बेहतर विकल्प है। यह प्रदर्शन में काफी बेहतर स्थान और समय पैदा करने की संभावना है।

मेरे सवाल है, तुम क्यों कभी पहली जगह में एक नया उदाहरण प्राप्त करना चाहते हैं? ऐसा लगता है जैसे चीजें सरल होंगी अगर ऐसे निर्माता रचनात्मक थे।

if (myBoolean == Boolean.TRUE) 

यह क्योंकि सभी सच्चे BooleansBoolean.TRUE के लिए संदर्भ होगा और सभी झूठे Booleans संदर्भ होगा सुरक्षित हो जाएगा: उदाहरण के लिए, अगर वे थे, तो आप इस कोई खतरा नहीं है (भले ही myBoolean थे null) के साथ लिख सकता है Boolean.FALSE पर। लेकिन क्योंकि कंस्ट्रक्टर्स सार्वजनिक कर रहे हैं, कोई उन्हें इस्तेमाल किया हो सकता है, जिसका अर्थ है कि आप इस के बजाय लिखने के लिए है:

if (Boolean.TRUE.equals(myBoolean)) 

लेकिन जहां यह वास्तव में बुरा हो जाता है जब आप समानता के लिए दो Booleans जाँच करना चाहते हैं। कुछ इस तरह:

if (
    myBooleanA == myBooleanB || 
    (myBooleanA != null && myBooleanA.equals(myBooleanB)) 
) 

अद्यतन:

if (myBooleanA == myBooleanB) 

... इस हो जाता है जावा 7 की रिलीज के साथ, java.util.Objects इस सरल संभव का निर्माण करता है:

if (Objects.equals(myBooleanA, myBooleanB)) 

मैं इन वस्तुओं के अलग-अलग उदाहरण रखने के किसी भी कारण के बारे में नहीं सोच सकता जो उपरोक्त बकवास न करने की तुलना में अधिक आकर्षक है। आपने क्या कहा?

+0

आपको वह अंतिम कोड ब्लॉक गलत है। या तो 'एक == शून्य? बी == शून्य: a.equals (बी) 'या' ए == बी || (ए! = नल एंड ए एक्वल्स (बी)) '। या 'ऑब्जेक्ट्स .एक (ए, बी) '। –

+0

आप सही हैं। मैंने इसे 'ए == बी || में बदल दिया (ए! = नल एंड ए एक्वल्स (बी)) '। –

उत्तर

5

कैश किए गए मान कभी कचरा एकत्र नहीं होते हैं, इसलिए जब भी आप उन्हें नरम/कमजोर संदर्भ के रूप में उपयोग करना चाहते हैं तो रचनाकारों का उपयोग करें, ताकि जब भी आवश्यकता हो, कचरा इकट्ठा किया जा सके। यह , Integer#valueOf() पर लागू होता है और कैशबल श्रेणियों के भीतर मूल्यों के साथ वाणिज्य।

ग्रहण में एक संदर्भ खोज करना मुझे पता चलता है कि प्रत्येक के तहत java.lang.Thread का उपयोग करता new Boolean() एक नरम-संदर्भ आधारित कैश के रूप में, तो यह और भी स्पष्ट रूप से (isCCLOverridden() विधि में) टिप्पणी की है:

/* 
* Note: only new Boolean instances (i.e., not Boolean.TRUE or 
* Boolean.FALSE) must be used as cache values, otherwise cache 
* entry will pin associated class. 
*/ 
-1

इन वस्तु प्रकार क्योंकि जरूरत थी संग्रह वर्ग केवल वस्तुओं को स्वीकार करता है, इसलिए आप देशी प्रकारों का उपयोग नहीं कर सके।

इसने उस डिज़ाइन की शुरुआत की जिसकी आप बात कर रहे हैं और इसलिए ऑटोबॉक्सिंग पेश की गई थी।क्योंकि वे हमेशा थे सार्वजनिक

संपादित

और कंस्ट्रक्टर सार्वजनिक कर रहे हैं। कुछ बहुत ही खराब कोड में ऑटोबॉक्सिंग की दुनिया से पहले आप new Integer(0) != new Integer(0) सच होना चाहते थे। यह मूल डिजाइन की किसी भी चीज़ से अधिक दोष था, हालांकि यह सार्वजनिक इंटरफेस का हिस्सा है क्योंकि अब वे पुराने कोड को तोड़ना नहीं चाहते हैं।

मुझे लगता है कि वे अब इसे हटा सकते हैं और अधिकांश लोग ऑटोबॉक्सिंग केवल काम करने के बाद ठीक होंगे।

1

कंस्ट्रक्टर्स पश्च संगतता की वजह से सार्वजनिक रहे हैं ... .valueOf() केवल जावा 1.4 में जोड़ा गया ...

इसके अलावा अपने उदाहरण में एक त्रि-राज्य चर के रूप में एक बूलियन का उपयोग कर (शून्य/सही/गलत) शायद एक बुरा विचार है - एक enum (UNKNOWN, TRUE, FALSE) का उपयोग करने के लिए बेहतर है, या यदि शून्य मान्य मान नहीं है, तो इसके लिए जांचें, और समानता परीक्षण के लिए मैन्युअल रूप से अनबॉक्स करें।

+0

बूलियन का उपयोग त्रि-राज्यों के रूप में करने के संबंध में: मैं मानता हूं, enums बेहतर हैं, लेकिन यह एक रक्षात्मक प्रोग्रामिंग चीज से अधिक है; यानी उस मामले को संभालना जहां कोई आपको केवल शून्य या गलत होने की उम्मीद कर रहा था। (यह सही कारण है कि मुझे लगता है कि ऑटोऑनबॉक्सिंग खतरनाक है; जब आप प्राइमेटिव्स जैसे ऑब्जेक्ट्स का इलाज कर रहे हैं तो यह शून्य मामले को अनदेखा करना बहुत आसान बनाता है।) –

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