2011-02-03 10 views
9

जावा में, मैं इसजावा बूलियन रैपर वर्ग को तत्काल कैसे मिलता है?

Boolean b = true ; 

की तरह कोड लिख सकते हैं और यह काम करेंगे। अब मेरे पास एक ऑब्जेक्ट है जो मान "सत्य" रखता है।

यह कैसे काम करता है? मुझे कन्स्ट्रक्टर के माध्यम से मूल्य क्यों नहीं पारित करना है? इस तरह:

Boolean b = new Boolean(true) ; 

साथ ही, क्या मैं कस्टम कक्षाएं बना सकता हूं जिन्हें मैं इसी तरह से तत्काल कर सकता हूं? यदि ऐसा है तो उसे क्या कहा जाता है?

तो मैं इस तरह कुछ करना है कि कर सकते हैं:

Foobar foobar = "Test" ; 

और इस तरह अपने ही आवरण वर्ग की है।

धन्यवाद

+0

इसे ऑटोबॉक्सिंग कहा जाता है। 'जावा ऑटोबॉक्सिंग' गुगलिंग आप जो देख रहे हैं उस पर बहुत सारी जानकारी प्रदान करेंगे। –

+2

बाद वाले भाग को जावा की तुलना में अधिक मशीनरी की आवश्यकता होती है। स्कैला में, उदाहरण के लिए यह शायद – svrist

+0

के साथ किया जा सकता है धन्यवाद सबको, मैंने पहले कभी "autoboxing" शब्द नहीं सुना। – CrazyPenguin

उत्तर

13

नहीं, आप बाद वाले नहीं कर सकते हैं।

पूर्व को autoboxing कहा जाता है और जावा रैपर में ऑटो रैप, प्राइमेटिव्स को उनके रैपर समकक्ष में पेश किया गया था।

जब जेनरिक और/या संग्रह का उपयोग कर autoboxing से लाभ स्पष्ट रूप से देखा गया जा सकता है:

लेख से: J2SE 5.0 in a Nutshell

"autoboxing और आदिम प्रकार के स्वत: बॉक्स से निकालना" नमूना हम है:

से पहले (autoboxing जोड़ा गया है)

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, new Integer(42)); 
int total = (list.get(0)).intValue(); 

ArrayList<Integer> list = new ArrayList<Integer>(); 
list.add(0, 42); 
int total = list.get(0); 

जैसा कि आप देखते हैं, कोड स्पष्ट है।

बस ध्यान प्रलेखन पर पिछले टिप्पणी सहन:

तो जब आप autoboxing और unboxing इस्तेमाल करना चाहिए? उनको केवल तभी उपयोग करें जब संदर्भ प्रकारों और प्राइमेटिव के बीच "प्रतिबाधा विसंगति" हो, उदाहरण के लिए, जब आपको संग्रह में संख्यात्मक मान रखना होगा। वैज्ञानिक कंप्यूटिंग, या अन्य प्रदर्शन-संवेदनशील संख्यात्मक कोड के लिए ऑटोबॉक्सिंग और अनबॉक्सिंग का उपयोग करना उचित नहीं है। एक इंटीजर एक int के लिए एक विकल्प नहीं है; autoboxing और unboxing आदिम प्रकार और संदर्भ प्रकार के बीच भेद धुंधला, लेकिन वे इसे खत्म नहीं करते हैं।

String s = "foobar" 

यह सिर्फ वास्तव में जावा में एक उबाल आना है,:

1

यह उसी तरह है कि आप इस तरह के रूप स्ट्रिंग वस्तुओं बना सकते हैं। मुझे यकीन नहीं है कि आप अपनी खुद की रैपर कक्षा क्यों बनाना चाहते हैं, या तो किसी भी आदिम डेटा प्रकार में पहले से ही एक पूर्वनिर्धारित wrapper है ...

+0

मेरे पास इसके लिए व्यावहारिक आवश्यकता नहीं है, लेकिन मुझे एहसास हुआ कि मुझे नहीं पता कि यह कैसे काम करता है, और "autoboxing" वाक्यांश को जानने के बिना कुछ फलहीन Google खोजें थीं – CrazyPenguin

0

इसे autoboxing कहा जाता है और मूल रूप से कुछ आपके लिए संकलक करता है। इसे केवल जावा 5 में जोड़ा गया था, इससे पहले कि आपको new Boolean(true), या (बेहतर) Boolean.TRUE का उपयोग करना पड़े।

और नहीं, आप इसे अपने स्वयं के वर्गों के लिए नहीं प्राप्त कर सकते हैं, यह केवल प्राचीन रैपर वर्गों के लिए किया जाता है।

3

यह कैसे काम करता है?

यह एक कंपाइलर-सुविधा है। कंपाइलर स्वचालित रूप से मुक्केबाजी-ऑपरेशन उत्पन्न करेगा। क्या यह वास्तव में क्या करेंगे

Boolean.valueOf(true); 

उत्पन्न करने के लिए है क्योंकि इस तरह से मौजूदा (अपरिवर्तनीय) उदाहरणों Boolean.TRUE और Boolean.FALSE बजाय एक नया बनाने के लिए इस्तेमाल किया जाएगा।

1

यह सुविधा जावा 1.5 में जोड़ा गया था और इसे Autoboxing कहा जाता है। इस प्रकार का जादू केवल प्राचीन मूल्यों और संवाददाता रैपरों के लिए उपलब्ध है।

और आप इसे जावा में स्वयं नहीं कर सकते हैं। यदि आप अभी भी इसे चाहते हैं, Scala के लिए जाने से - यह बढ़िया है! अर्थात् आप implicit conversions नामक सुविधा का उपयोग कर सकते हैं। यहां आपके मामले के लिए छोटा उदाहरण दिया गया है:

case class Foobar(value: String) 
implicit def convertStringToFoobar(s: String) = Foobar(s) 
val foobar: Foobar = "Test"; 
संबंधित मुद्दे