2017-08-14 21 views
16

के बिना तत्काल बनाया गया है क्या मैं एक कक्षा बना सकता हूं जो = ऑपरेटर के साथ तत्काल हो, जैसे String कक्षा करता है? या यह जावा में String कक्षा के लिए विशिष्ट सुविधा है?अपरिवर्तनीय ऑब्जेक्ट बनाएं, बिना नए

+6

नहीं, आप नहीं कर सकते। यह कुछ ऐसा है, जैसा आपने कहा था, 'जावा के अंदर स्थित है'। – sudo

+12

और स्ट्रिंग्स * नहीं * '=' के साथ तत्काल हैं।स्ट्रिंग स्थिरांक को '"..." के साथ परिभाषित किया गया है और यह केवल वहां से अधिक जटिल हो जाता है। तो, नहीं, आप नहीं कर सकते। 'नया' का प्रयोग करें। यदि आपको 'नया' पसंद नहीं है, तो आप इसे एक स्थिर फैक्ट्री विधि या उसके जैसा कुछ छुपा सकते हैं। –

+0

https://stackoverflow.com/questions/2068570/how-to-create-a-string-class-replica – soorapadman

उत्तर

14

क्योंकि जावा का समर्थन नहीं करता उपयोगकर्ता परिभाषित ऑपरेटर ओवरलोडिंग एक नया उदाहरण = ऑपरेटर के साथ नहीं बनाया जा सकता।

चेक बाहर Why doesn't Java offer operator overloading? अधिक जानकारी के लिए

16

नहीं, आप एक वर्ग है कि बस = ऑपरेटर के साथ instantiated है क्योंकि क्या आप सी में कर सकते हैं ++ या सी # (Operator overloading in Java देखें) की तरह जावा में एक ऑपरेटर को ओवरलोड नहीं कर सकते नहीं बना सकते।

String रों instantiated हैं जब आप "something" का प्रयोग तभी यह पहले से ही स्मृति में मौजूद नहीं है, तो आप एक ही सटीक String ऑब्जेक्ट के संदर्भ हर बार जब आप "something" बारे में मिलता है।

उदाहरण के लिए

, यदि आप कार्य करें:

String a = "something"; 
String b = "something"; 

फिर

a == b; // will be true. 

आप इस सवाल पर एक नज़र बारे में अधिक जानने के लिए कैसे String वस्तुओं काम ले सकते हैं:

7

कोड String s = "Hello World!" एक नया String नहीं बनाता है। यह स्ट्रिंग पूल में s पर मौजूद String का संदर्भ निर्दिष्ट करता है। यदि स्ट्रिंग पूल में String मौजूद नहीं है, तो स्ट्रिंग पूल में एक नया String ऑब्जेक्ट बनाया गया है, लेकिन ऑपरेटर = अकेले नहीं है।

यह बनाता है नई String objecs:

String s1 = new String("Hello World!"); // new Object 
String s2 = new String("Hello World!"); // new Object 

System.out.println(s1 == s2); // false 

यह या स्ट्रिंग पूल में एक नया String वस्तु नहीं बना सकते हो सकता है:

String s1 = "Hello World!"; 
String s2 = "Hello World!"; 

System.out.println(s1 == s2); // true 

आप काफी व्यवहार उपयोग करने के साथ ऊपर उल्लेख के करीब हो सकता है getInstance() पैटर्न, इस पर विचार करें:

public class Singleton { 
    private Singleton(){} 

    private static class SingletonHelper{ 
    private static final instance INSTANCE = new Singleton(); 
    } 

    public static Singleton getInstance() { 
    return SingletonHelper.INSTANCE; 
    } 
} 

फिर आप इसका उपयोग कर सकते हैं:

Singleton s = Singleton.getInstance(); 
+3

पहला कोड स्निपेट आवश्यक रूप से स्ट्रिंग पूल में एक नया 'स्ट्रिंग' नहीं बनाता है ('नई स्ट्रिंग (...)' द्वारा बनाए गए तार पूल में निहित नहीं हैं)। – Nevay

+0

@Nevay आप बिल्कुल सही हैं, मेरी गलती, मेरे जवाब को सही किया। –

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