2009-07-02 22 views
5

वहाँ किजावा में, हमेशा नया नया है?

Thing thing = new Thing(); 

की तरह एक बयान नहीं एक नई वस्तु में परिणाम (अर्थात किसी भी तरह कि thing पहले से मौजूदा वस्तु की ओर इशारा करते हो सकता है) बनाया जा रहा सकता है जावा में कोई तरीका है?

+2

आप क्यों पूछते हैं? क्या आप कहीं अजीब व्यवहार कर रहे हैं? –

+2

कोई अजीब व्यवहार नहीं। बस उत्सुक - मैं इंटीजर (int i) कन्स्ट्रक्टर के बारे में पढ़ रहा था - यह मुद्दा यह था कि स्थैतिक विधि Integer.valueOf (int i) बेहतर हो सकता है क्योंकि यह आवश्यक वस्तुओं का पुन: उपयोग करेगा - मैं यह देखना चाहता था कि यह असंभव था पुन: उपयोग करने के लिए एक कन्स्ट्रक्टर के लिए, केवल अपरंपरागत नहीं। –

+8

हाँ, यह असंभव है। सी ++ में, आप 'नए' ऑपरेटर को ओवरराइड कर सकते हैं, लेकिन आप जावा में नहीं जा सकते हैं। जो मुझे दुखी नहीं करता है। –

उत्तर

16

new ऑपरेटर नई ढेर स्थान आवंटित करता है और निर्माता को कॉल करता है। आपको हमेशा एक नई वस्तु मिल जाएगी (जब तक कि अन्य ने इंगित नहीं किया है, कन्स्ट्रक्टर में एक अपवाद फेंक दिया गया है)।

यह बात स्थिर विधियों के साथ थोड़ा अलग है जो एक संदर्भ लौटाती है, जैसे कि Integer.valueOf() जो संभव हो तो आंतरिक पूल से वस्तुओं का पुन: उपयोग करता है।

+1

हाँ और यह महान जोशुआ ब्लोच के "प्रभावी जावा" –

6

यदि थिंग के लिए निर्माता एक अपवाद फेंकता है, तो ऑब्जेक्ट नहीं बनाया गया है। हालांकि, thing कभी भी चीज के किसी अन्य मौजूदा उदाहरण को इंगित नहीं करेगा।

+0

और न ही 'शून्य' मानों में भी एक अनुशंसित पैटर्न है। कोड को देखने के लिए अजीब बात है जैसे 'थिंग टी = नया थिंग(); अगर (टी == शून्य) ... '- यह कभी नहीं होगा –

0

नहीं, इस मामले में स्मृति में कोई जगह नहीं है, तो आपको आउटऑफमेमरी एरर प्राप्त करना चाहिए।

बेशक, थिंग कन्स्ट्रक्टर द्वारा अन्य अपवादों को फेंक दिया जा सकता है।

+0

हमम, क्यों नहीं एक आउटऑफमेरी एरर? बस दिलचस्पी है –

+0

सही अपवाद वास्तव में OutOfMemoryError है। – cd1

+0

@ सीडी 1 @ टिम ने गलती को सही किया। मुझे पता था कि यह ऐसा कुछ था। मेरा बुरा –

0

मुझे यकीन नहीं है कि मैं आपके प्रश्न को सही तरीके से समझता हूं।

नई स्थिति की परिभाषा आवंटित करने और आरंभ करने के लिए नई परिभाषा है।

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

जब से तुम this का मूल्य संशोधित नहीं कर सकते (अन्यथा आप बस अपने निर्माता में this = oldObject की तरह कुछ कह सकते हैं), एक ही रास्ता आप ऐसा कर सकता है, एक अपवाद फेंकने के लिए है।

0

जहां तक ​​मुझे पता है कि यह सी ++ की तरह नहीं है जहां आप operator new अधिभारित कर सकते हैं या प्लेसमेंट नई या अन्य आवंटक चीजें कर सकते हैं। (लेकिन मैं जेएलएस से परिचित नहीं हूं)

3

new का उपयोग करके हमेशा एक नई वस्तु आवंटित और बनाई जाएगी। हालांकि, आप इंटर्निंग की अवधारणा का जिक्र कर रहे हैं, जहां ऑब्जेक्ट्स और पूल में संग्रहीत किया जाता है और अंतरिक्ष पर सहेजने के लिए पुन: उपयोग किया जा सकता है। एक अच्छे उदाहरण के लिए, जावा में String interning पर यह आलेख देखें।

1

नया हमेशा नया होता है (शायद आदिम रैपर के लिए कुछ अपवादों के साथ), लेकिन यदि वस्तुओं का पुन: उपयोग करना वांछित व्यवहार है तो कुछ डिज़ाइन पैटर्न (सिंगलटन, फैक्ट्री, पूल इत्यादि) के माध्यम से ऐसा करने के तरीके हैं।

+1

आदिम रैपर (जिसे बॉक्सिंग प्राइमेटिव भी कहा जाता है) किसी भी अन्य वर्ग के समान नियमों का पालन करते हैं: यदि आप एक बनाने के लिए एक कन्स्ट्रक्टर का उपयोग करते हैं, तो आपको हमेशा एक नया उदाहरण मिलता है। हालांकि, ऑटोबॉक्सिंग हर बार एक अनूठी वस्तु नहीं बनाती है क्योंकि यह एक निर्माता के बजाए फैक्ट्री विधि का उपयोग करती है। –

+0

क्या मैंने कुछ अलग कहा था? – quosoo

+1

नया हमेशा नया है। आदिम रैपर के लिए भी कोई अपवाद नहीं है। – dave4420

-1

जावा में, केवल एक चीज जिसे मैं सोच सकता हूं सिंगलटन पैटर्न का उपयोग कर रहा है। यह चीज के कई नए उदाहरण नहीं बनाएगा, बल्कि हर बार एक ही वस्तु का एक उदाहरण होगा।

+1

जब भी आप 'new' का उपयोग करते हैं, तो आप एक नया उदाहरण बना रहे हैं। अवधि। सिंगलटन पैटर्न के साथ, आप 'सिंगलटन क्लास.getInstance()' को कॉल कर रहे हैं, न कि 'नया सिंगलटन क्लास() '। –

4

कई लोग कह रहे हैं कि यदि कोई निर्माता अपवाद फेंकता है तो कोई ऑब्जेक्ट नहीं बनाया जाएगा। मैं बस यह इंगित करना चाहता हूं कि यह सच नहीं है।एक उदाहरण के रूप में, यह बहुत बुरा कोड पर एक नज़र डालें:

public class Test { 
    static int count; 

    static Set<Test> set = new HashSet<Test>(); 

    int id = count++; 


    public Test() { 
     set.add(this); 
     throw new RuntimeException(); 
    } 


    public static void main(String[] args) throws Exception { 
     for(int i = 0; i < 5; i++) { 
      try { 
       new Test(); 
      } catch(Exception e) { 
      } 
     } 
     System.out.println(set); 
    } 


    public String toString() { 
     return "Test[" + id + "]"; 
    } 
} 

उत्पादन होता है:

[Test[0], Test[1], Test[2], Test[4], Test[3]] 

new एक नई वस्तु हर समय पैदा करता है।

0

नया हमेशा नई वस्तु बनाता है। जावा में आप नए का उपयोग कर ऑब्जेक्ट का पुन: उपयोग नहीं कर सकते हैं। वास्तव में यह कुछ जावा वर्ग में प्रदर्शन समस्या का कारण बनता है। उदाहरण के लिए बूलियन क्लास व्यावहारिक रूप से केवल दो मानों (सत्य या गलत) को स्टोर कर सकती है, फिर भी कोई उपयोगकर्ता नए ऑब्जेक्ट का उपयोग करके एक ही मूल्य के साथ कई ऑब्जेक्ट्स बना सकता है।

0

सं

कोड thing की उस पंक्ति को क्रियान्वित करने के लिए एक उद्देश्य यह है कि उस रेखा से पहले मौजूद संदर्भ कभी नहीं होगा करने के बाद।

0

new पर कॉल विफल हो सकता है यदि यह पहली बार है कि आप कक्षा का जिक्र कर रहे हैं और यदि कक्षा में स्थिर ब्लॉक हैं जो प्रारंभ करने में असफल होते हैं। मैंने उन व्यवहारों का अनुभव किया है जिनमें स्थिर ब्लॉक या कन्स्ट्रक्टर में होने वाली किसी भी रनटाइम त्रुटियों के परिणामस्वरूप वेब कॉलर अनुप्रयोग सर्वर के भीतर उपयोग के संदर्भ में क्लास नॉटफाउंड अपवाद को फेंकने वाला नया कॉल होगा। Websphere क्लास लोडर स्पष्ट रूप से रनटाइम अपवाद के कारण कक्षा को लोड होने से अस्वीकार कर देता है।

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