Java में कोई String.Empty क्यों नहीं है?


260

मैं समझता हूं कि हर बार जब मैं स्ट्रिंग शाब्दिक टाइप करता हूं, स्ट्रिंग स्ट्रिंग ""में उसी स्ट्रिंग ऑब्जेक्ट को संदर्भित किया जाता है।

लेकिन स्ट्रिंग एपीआई में ए शामिल क्यों नहीं है public static final String Empty = "";, इसलिए मैं संदर्भ का उपयोग कर सकता हूं String.Empty?

यह संकलित समय पर, बहुत कम से कम बचाएगा, क्योंकि संकलक को मौजूदा स्ट्रिंग का संदर्भ लेना पता होगा, और यह जांचने के लिए नहीं है कि क्या यह पहले से ही पुन: उपयोग के लिए बनाया गया था, है ना? और व्यक्तिगत रूप से मुझे लगता है कि कई मामलों में स्ट्रिंग साहित्यिकों का प्रसार, विशेष रूप से छोटे लोग, "कोड गंध" है।

तो क्या कोई String.Empty के पीछे एक ग्रैंड डिज़ाइन कारण था, या क्या भाषा निर्माताओं ने केवल मेरे विचार साझा नहीं किए थे?


5
Aidanc: मुझे लगता है कि वह ऐसी स्थितियों का अर्थ है जहां आप सामान की तरह काम करते हैं outputBlah = "", और वह संभवत: something == String.Emptyअधिक पसंद करता है something.Length > 0(आप एक अशक्त जांच छोड़ देते हैं।)
Skurmedel

2
@Aidanc - वह की तरह एक "खाली सदस्य" के लिए देख रहा था Collections.EMPTY_SET , नहीं स्ट्रिंग "शून्य" के लिए जाँच करने के लिए एक समारोह।
टिम स्टोन

2
@ ऐडैंक: यह वास्तव में 'टेक्स्टबॉक्स.सेटटेक्स्ट ("") है?'
टॉम ट्रान्सस्की

3
एक String.isEmpty()समारोह है ... आप क्यों चाहेंगे String.EMPTY?
बुहके सिंडी

8
String.isEmpty()एक खाली स्ट्रिंग वापस नहीं करता है।
स्टीव कू १o

जवाबों:


191

String.EMPTY12 वर्ण है, और ""दो है, और वे दोनों रनटाइम में स्मृति में बिल्कुल उसी उदाहरण को संदर्भित करेंगे। मुझे पूरा यकीन नहीं है कि String.EMPTYसंकलन समय पर क्यों बचा होगा, वास्तव में मुझे लगता है कि यह बाद का होगा।

विशेष रूप से विचार करना Stringअपरिवर्तनीय है, ऐसा नहीं है कि आप पहले एक खाली स्ट्रिंग प्राप्त कर सकते हैं, और उस पर कुछ संचालन कर सकते हैं - एक का उपयोग करने के लिए सबसे अच्छा StringBuilder(या StringBufferयदि आप थ्रेड-सुरक्षित होना चाहते हैं) और उसे स्ट्रिंग में बदल दें।

अद्यतन
अपनी टिप्पणी से प्रश्न के लिए:

यह वास्तव में क्या प्रेरित है TextBox.setText("");

मेरा मानना ​​है कि यह आपके उपयुक्त वर्ग में एक निरंतर प्रदान करने के लिए पूरी तरह से वैध होगा:

private static final String EMPTY_STRING = "";

और फिर इसे अपने कोड के रूप में देखें

TextBox.setText(EMPTY_STRING);

इस तरह कम से कम आप स्पष्ट हैं कि आप एक खाली स्ट्रिंग चाहते हैं, बजाय इसके कि आप अपनी आईडीई या कुछ इसी तरह स्ट्रिंग में भरना भूल गए।


14
मैं अभी भी आपको +1 कर रहा हूं, लेकिन मुझे यह गंदा लगता है क्योंकि आपने उल्लेख किया है StringBuilderकि दस में से नौ बार यह कैसे कहा जाता है कि यह StringBuilderसहमति के बजाय उपयोग करने के लिए पूरी तरह से अनुचित है ।
Randolpho

84
मैं स्ट्रिंग को प्राथमिकता देना चाहता हूं। अधिकतर, क्योंकि यह अधिक स्पष्ट है। इसके अलावा, ऐसी दर स्थितियां हैं, जहां नेत्रहीन रूप से "" और "" जैसी चीजों में अंतर करना कठिन हो सकता है। अंत में जैसा कि अन्य ने उल्लेख किया है कि यह उन व्यर्थ शैली वाली चीजों में से एक है जो हमें असली काम से ऊब जाने पर बहस करने के लिए चारा देती हैं। =)
JohnFx

@ नोडल एम: संकलित समय के बारे में, मैं मानूंगा कि यदि 2 स्ट्रिंग स्रोत में 2 अलग-अलग स्रोत फ़ाइलों में एक ही स्ट्रिंग मान के साथ परिभाषित किया गया है, जब कंपाइलर 2 को हिट करता है तो यह पता लगाने के लिए किसी तरह की जांच करने की आवश्यकता है " हे, मैं पहले से ही इस स्ट्रिंग के बारे में यहाँ से जानता हूँ "। मैं वास्तव में जावा कंपाइलर में कोई विशेषज्ञ नहीं हूं, लेकिन यह मामला कैसे नहीं हो सकता है? और मुझे लगता है कि उस चेक को स्किप करने से संकलन समय में मामूली सुधार होगा।
टॉम ट्रान्स्की

@ टोम - मेरा मानना ​​है कि स्ट्रिंग इंटर्निंग रनटाइम पर की जाती है, संकलन समय पर नहीं, इसलिए वास्तव में यदि आपके पास एक अन्य फ़ाइल में एक स्थिर के रूप में खाली स्ट्रिंग है, तो संकलक को उस वर्ग को संदर्भ देने की आवश्यकता है जो स्ट्रिंग शाब्दिक को हल करने के लिए है।
नोएल एम

1
@ रैंडोल्फो जब स्ट्रिंग समंजन का उपयोग कर रहे हैं तो वास्तव में हुड के नीचे एक स्ट्रिंगबर्ल का उपयोग कर रहे हैं।
व्हिस्कीसाइअरा

133

उपयोग org.apache.commons.lang.StringUtils.EMPTY


29
खाली "" की तुलना में बहुत अच्छा लगता है और पढ़ने में आसान होता है। मुझे उम्मीद है कि यह सिर्फ मेरे लिए नहीं है।
लकाटोस ग्यूला

2
@ लकाटोसग्युला - मुझे लगता है कि यह (सिर्फ आप) हो सकता है। कुशल जावा प्रोग्रामर कोई समस्या नहीं पढ़ने की है ""... और सबसे शायद के उपयोग के बारे जोर से आपत्ति हैं EMPTYजहां विशिष्ट परिस्थितियों के अलावा EMPTYएक डोमेन विशिष्ट अर्थ नहीं है। (और ऐसे मामलों में, शायद अधिक उपयुक्त नाम है।)
स्टीफन सी

14
@LakatosGyula यह सिर्फ आप नहीं है। मैं जावा से .NET विकास में गया, और String.Empty एक ऐसी सुविधा थी जिसे मैं फ्रेमवर्क में पाकर प्रसन्न था। मुझे उद्धरणों के एक खाली सेट पर इसकी स्पष्ट प्रकृति पसंद है।
योहोहोहो

63
@StephenC जब मैं एक खाली देखता हूं "" मेरे दिमाग में पहली बात कूदती है कि यह एक बग है, किसी ने फ़ंक्शन आदि को समाप्त नहीं किया है। String.EMPTY के साथ मैं वास्तव में जानता हूं कि डेवलपर को खाली स्ट्रिंग वापस करने का इरादा है।
लकाटोस ग्युला

1
उन सभी समयों के लिए भी उपयोगी है जब लिंटर कहता है "ब्ला ब्ला ब्ला के बजाय एक नामित स्थिरांक का उपयोग करें"। प्रत्येक प्रोग्रामर जानता है कि "" जादू नहीं है, लेकिन ग्राहक को यह समझाने की ज़रूरत नहीं है कि यह बेहतर है।
लिजह

28

यदि आप रिक्त मानों की चिंता किए बिना रिक्त स्ट्रिंग के साथ तुलना करना चाहते हैं, तो आप निम्न कार्य कर सकते हैं।

if ("".equals(text))

अंतत: आपको वही करना चाहिए जो आप मानते हैं कि वह स्पष्ट है। अधिकांश प्रोग्रामर मान लेते हैं "" का अर्थ है रिक्त स्ट्रिंग, न कि एक स्ट्रिंग जिसे कोई कुछ भी डालना भूल गया।

यदि आपको लगता है कि कोई प्रदर्शन लाभ है, तो आपको इसका परीक्षण करना चाहिए। अगर आपको नहीं लगता कि इसकी कीमत खुद के लिए है, तो इसका अच्छा संकेत यह वास्तव में इसके लायक नहीं है।

ऐसा लगता है कि आप एक समस्या को हल करने की कोशिश करते हैं जो 15 साल से अधिक समय पहले डिज़ाइन की गई थी।


1
मुझे पार्टी में काफी देर हो गई है लेकिन, चूंकि जावा तार अपरिवर्तनीय है, मेरा मानना ​​है कि एक जेवीएम के भीतर सभी खाली तार एक ही स्ट्रिंग ऑब्जेक्ट के लिए अलग-अलग संदर्भ हैं। तो बस निम्नलिखित भी सही है: if ("" == text)
अजो भाटिया

12
@AjoyBhatia समस्या यह है कि आप नए खाली स्ट्रिंग बना सकते हैं। if ("" == new String())गलत है। एक बेहतर परीक्षणif(text.isEmpty())
पीटर लॉरी

1
@AjoyBhatia - केवल अगर तारों को नजरबंद किया जाता है। stackoverflow.com/questions/10578984/what-is-string-interning
डावोर

9

यदि आप वास्तव में एक String.EMPTY स्थिरांक चाहते हैं, तो आप अपनी परियोजना में "कॉन्स्टेंट" (उदाहरण के लिए) नामक एक उपयोगिता स्थैतिक अंतिम वर्ग बना सकते हैं। खाली स्ट्रिंग सहित यह वर्ग आपके स्थिरांक को बनाए रखेगा ...

एक ही विचार में, आप ZERO, One int constants बना सकते हैं ... जो कि इंटेगर क्लास में मौजूद नहीं है, लेकिन जैसे मैंने टिप्पणी की, यह लिखने और पढ़ने के लिए एक दर्द होगा:

for(int i=Constants.ZERO; ...) {
    if(myArray.length > Constants.ONE) {
        System.out.println("More than one element");
    }
}

आदि।


8

Apache StringUtils इस समस्या को भी संबोधित करता है।

अन्य विकल्पों की विफलता:

  • isEmpty () - शून्य सुरक्षित नहीं है। यदि स्ट्रिंग अशक्त है, तो एक एनपीई फेंकता है
  • लंबाई () == 0 - फिर से सुरक्षित नहीं है। इसके अलावा व्हॉट्सएप के तार को भी ध्यान में नहीं रखा गया है।
  • EMPTY स्थिरांक की तुलना - सुरक्षित नहीं हो सकता है। व्हॉट्सएप की समस्या

ग्रांटेड StringUtils चारों ओर खींचने के लिए एक और पुस्तकालय है, लेकिन यह बहुत अच्छी तरह से काम करता है और नल के लिए समय और परेशानी की जाँच के भार को बचाता है या सुशोभित रूप से NPEs को संभालता है।


3
तो ... ऐसा लगता है कि एकमात्र सुरक्षित विकल्प भयानक योडा स्थिति है "".equals(s):?
रेयान

8

केवल यह मत कहो कि "स्ट्रिंग्स के मेमोरी पूल का शाब्दिक रूप में पुन: उपयोग किया जाता है, केस बंद"। हुड के नीचे क्या संकलक करते हैं, यहां बात नहीं है। सवाल वाजिब है, विशेष रूप से इसे प्राप्त अप-वोटों की संख्या को देखते हुए।

यह समरूपता के बारे में है , इसके बिना एपीआई मनुष्यों के लिए उपयोग करना कठिन है। प्रारंभिक जावा एसडीके ने कुख्यात रूप से नियम की अनदेखी की और अब यह बहुत देर हो चुकी है। यहाँ मेरे सिर के शीर्ष पर कुछ उदाहरण हैं, अपने "पसंदीदा" उदाहरण में चिप करने के लिए स्वतंत्र महसूस करें:

  • BigDecimal.ZERO, लेकिन कोई AbstractCollection.EMPTY, String.EMPTY
  • Array.length लेकिन List.size ()
  • List.add (), Set.add () लेकिन Map.put (), ByteBuffer.put () और StringBuilder.append (), Stack.push () को न भूलें।

यहां तक ​​कि अगर आपने सूची पैरामीटर लंबाई () का नाम दिया है तो भी आपको विधि के बाद से कोष्ठक की आवश्यकता है। Array.length एक सार्वजनिक अंतिम चर है, जो केवल इसलिए काम करता है क्योंकि Arrays अपरिवर्तनीय हैं। तो आपके पास अभी भी Array.length और List.length () होगी। मैं तर्क दूंगा कि यह अधिक भ्रामक है और त्रुटि की संभावना है। के रूप में .append () और .push () के लिए, जबकि वे समान कार्य करते हैं मुझे लगता है कि वे उचित रूप से नाम रखते हैं। स्ट्रिंग को लागू करना वही है जो आप कर रहे हैं, लेकिन आप एक स्टैक को "अपेंड" नहीं करते हैं, आप पुश और पॉप वैल्यूज करते हैं। और StringBuilder.push () का अर्थ StringBuilder.pop () होगा, जो संभव नहीं है।
क्रेग पार्टन

टेम्प्लेट / जेनेरिक से आने वाले, लगातार इंटरफेस एल्गोरिदम के साथ भी मदद करते हैं। यदि एक एल्गोरिथ्म को एक संग्रह की लंबाई, लंबाई (T) या T.length () की आवश्यकता है, तो हम उसकी देखभाल करते हैं। इसी तरह, स्टैक के अंत में जोड़कर, सूची या एक तार एक सार्वभौमिक जोड़ () या परिशिष्ट () द्वारा किया जा सकता है। आपने उल्लेख किया है कि जावा में सरणी एक उजागर लंबाई की संपत्ति के साथ अपरिवर्तनीय / निर्मित प्रकार है। यह ठीक है, इसका मतलब यह नहीं है कि संकलक लंबाई (T) या T.length () के लिए कोड को संभाल या उत्पन्न नहीं कर सकता है। कोटलिन विभिन्न मामलों के लिए कई आंतरिक तरीके उत्पन्न करता है।
स्लावोमिर

लेकिन एक निरंतर नाम लंबाई () विधि केवल हमें लंबाई की जांच करने देती है। वह कितना उपयोगी है? यदि आपका लक्ष्य किसी इंटरफ़ेस के माध्यम से सूचियों और सारणियों को किसी तरह से उपयोग करने योग्य बनाना है, तो आपको डेटा को पढ़ने या लिखने के लिए एक सुसंगत तरीके की भी आवश्यकता है। तो अब आपको get (), set (), और add () मेथड जनरेट करने की आवश्यकता है। अनिवार्य रूप से, आप ऐरे का एक कम कार्यात्मक सूची दृश्य बना रहे हैं। चूंकि Arrays.asList () उपलब्ध है, इसका उपयोग करना आसान है, और हल्का है, पहिया को फिर से क्यों लगाया जाए? Arrays, Lists, StringBuilders और Stacks सभी का एक विशिष्ट उद्देश्य है। सबसे अच्छा फिट का उपयोग करने के लिए अपने इंटरफेस को डिजाइन करने के लिए बेहतर लगता है।
क्रेग पार्टन

5

वे सभी ""शाब्दिक अर्थ एक ही वस्तु हैं। वह सब अतिरिक्त जटिलता क्यों? यह केवल टाइप करने के लिए लंबा और कम स्पष्ट है (संकलक की लागत न्यूनतम है)। चूंकि जावा के तार अपरिवर्तनीय वस्तुएं हैं, इसलिए संभवत: दक्षता दक्षता के अलावा उनके बीच अंतर करने के लिए सभी की कोई आवश्यकता नहीं है, लेकिन खाली स्ट्रिंग शाब्दिक के साथ यह एक बड़ी बात नहीं है।

यदि आप वास्तव में एक EmptyStringनिरंतर चाहते हैं , तो इसे स्वयं बनाएं। लेकिन यह सब करेगा और भी अधिक वर्बोस कोड को प्रोत्साहित करेगा; ऐसा करने से कभी कोई लाभ नहीं होगा ।


27
x = String.Emptyइरादे से बेहतर बता देता है x = ""। उत्तरार्द्ध एक आकस्मिक चूक हो सकता है। कहने के लिए है कि वहाँ कभी नहीं कोई लाभ गलत है।
जेफरी एल व्हाइटलेज

@ जेफ्री: मुझे नहीं लगता कि मैं विशेष रूप से सहमत हूं। यह इन चीजों में से एक है जहाँ मुझे लगता है कि कोई कठिन और तेज़ नियम नहीं है।
डोनल फैलो

हां, यह बताना महत्वपूर्ण है कि जावा कंपाइलर यह जांचता है कि क्या स्ट्रिंग पूल में एक नया उदाहरण बनाने से पहले ही स्ट्रिंग शाब्दिक मौजूद हैं।
आरडीएस

1
@ जेफ्री - यह जानते हुए कि यह एक बहुत पुरानी और व्यक्तिपरक चर्चा है। x = String.Emptyइरादे को सच करता है, सच है। लेकिन मान लीजिए कि भाषा एक स्थिर प्रदान करती है String.Empty, जब आप मुठभेड़ करते हैं तो x = ""आप अभी भी इरादे के बारे में उतना ही जानते हैं जैसे कि ऐसा कोई स्थिरांक नहीं था। आपको यह सुनिश्चित करने की आवश्यकता होगी कि दुनिया के सभी स्थानों में जावा कोड जहां एक खाली स्ट्रिंग का उपयोग ""किया गया था ताकि आपके द्वारा उल्लेखित जानकारी प्राप्त करने के लिए उपयोग न किया जा सके। विडंबना यह है कि C # एक स्थिरांक का उपयोग करता है और इसके उपयोग को प्रोत्साहित करता है, इसलिए जैसा कि मैंने कहा, मुझे पता है कि यह एक बहुत व्याख्यात्मक चर्चा है।
चिक्कोडोरो

@chiccodoro - हां, यह सच है। इसीलिए खाली स्ट्रिंग शाब्दिक ""अवैध होना चाहिए, जिससे दुर्घटनाओं को नियंत्रित किया जा सके। मैं तो मजाक कर रहा हूँ!
जेफरी एल व्हाइटलेज

4

नोएल एम ने जो कहा, उस पर जोड़ने के लिए, आप इस प्रश्न को देख सकते हैं, और यह उत्तर दिखाता है कि निरंतर का पुन: उपयोग किया जाता है।

http://forums.java.net/jive/message.jspa?messageID=17122

स्ट्रिंग स्थिरांक हमेशा "इंटर्न" होते हैं, इसलिए वास्तव में ऐसे स्थिरांक की आवश्यकता नहीं होती है।

String s=""; String t=""; boolean b=s==t; // true

1
लिंक मर चुका है।
dieter

3

मैं समझता हूं कि हर बार जब मैं स्ट्रिंग शाब्दिक टाइप करता हूं "", उसी स्ट्रिंग स्ट्रिंग में संदर्भित किया जाता है।
ऐसी कोई गारंटी नहीं है। और आप अपने आवेदन में इस पर भरोसा नहीं कर सकते, यह पूरी तरह से तय करने के लिए jvm पर निर्भर है।

या भाषा रचनाकारों ने केवल मेरे विचार साझा नहीं किए?
हां। मेरे लिए, यह बहुत कम प्राथमिकता वाली बात लगती है।


6
इस तरह की कोई गारंटी नहीं है ... खैर, जेएलएस यह कहता है कि मामला होना चाहिए।
टिम स्टोन

@ जब तक आप 'इंटर्न' कॉल नहीं करते। दो समान बड़े तार का निर्माण प्रोग्रामेटिक रूप से करना और जांचना आसान है।
निकिता रायबाक

@ उदाहरण के लिए, एक + = "ए" दोहराएं ; 100 बार, बी और चेक के साथ भी ऐसा ही करें।
निकिता रायबाक

5
आप सही हैं, लेकिन आपने जो वर्णन किया है, वह स्ट्रिंग शाब्दिक नहीं है, न ही कोई अभिव्यक्ति जिसका परिणाम संकलन के समय (जैसे String username = "Bob" + " " + "Smith";) की गारंटी हो सकती है । जब तक आप स्पष्ट रूप से कॉल नहीं करते हैं, तब तक प्रोग्राम किए गए स्ट्रिंग्स को इंटर्न होने की कोई गारंटी नहीं है intern()। ओपी का परिदृश्य ""पूरे कोड में रिक्त स्ट्रिंग शाब्दिक का उपयोग करते हुए वर्णन करता है , जो एक ऐसा मामला है जहां स्वचालित इंटर्निंग होती है।
टिम स्टोन

@ String a = ""; for(int i = 0; i < 100; i++) {a += "a";} String b = ""; for(int i = 0; i < 100; i++) {b += "b";} a.intern(); b.intern();अब aऔर bPermGen में एक ही मेमोरी स्थान पर इंगित करें। इस लेख को
1ac0

1

देर से जवाब, लेकिन मुझे लगता है कि यह इस विषय में कुछ नया जोड़ता है।

पिछले प्रश्नों में से किसी ने भी मूल प्रश्न का उत्तर नहीं दिया है। कुछ ने निरंतरता की कमी को उचित ठहराने का प्रयास किया है, जबकि अन्य ने ऐसे तरीके दिखाए हैं जिनसे हम निरंतर की कमी से निपट सकते हैं। लेकिन किसी ने निरंतर के लाभ के लिए एक आकर्षक औचित्य प्रदान नहीं किया है, इसलिए इसकी कमी अभी भी ठीक से नहीं बताई गई है।

एक स्थिरांक उपयोगी होगा क्योंकि यह कुछ कोड त्रुटियों को किसी का ध्यान नहीं जाने से रोकेगा।

कहें कि आपके पास "" के लिए सैकड़ों संदर्भों के साथ एक बड़ा कोड आधार है। कोड में स्क्रॉल करते समय कोई इनमें से एक को संशोधित करता है और इसे "" में बदलता है। इस तरह के बदलाव से उत्पादन में किसी का ध्यान नहीं जाने की संभावना अधिक होती है, जिसके कारण यह कुछ समस्या का कारण बन सकता है जिसका स्रोत पता लगाने के लिए मुश्किल होगा।

OTOH, EMPTY नामक एक पुस्तकालय स्थिरांक, यदि उसी त्रुटि के अधीन, EM PTY जैसी किसी चीज़ के लिए संकलक त्रुटि उत्पन्न करेगा।

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

यह सामान्य लाभों में से एक है जो आपको शाब्दिक मूल्यों के बजाय स्थिरांक का उपयोग करने से मिलता है। आमतौर पर लोग मानते हैं कि दर्जनों स्थानों पर उपयोग किए जाने वाले मूल्य के लिए एक स्थिर का उपयोग करने से आप आसानी से उस मूल्य को केवल एक ही स्थान पर अपडेट कर सकते हैं। कम बार स्वीकार किया जाता है कि यह उस मूल्य को गलती से संशोधित होने से रोकता है, क्योंकि ऐसा परिवर्तन हर जगह दिखाई देगा। तो, हाँ, "" EMPTY से छोटा है, लेकिन EMPTY "" से अधिक सुरक्षित है।

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


-16

दावा करने वालों के लिए ""और String.Emptyविनिमेय हैं या जो ""बेहतर है, आप बहुत गलत हैं।

हर बार जब आप myVariable = "" जैसा कुछ करते हैं; आप किसी ऑब्जेक्ट का एक उदाहरण बना रहे हैं। यदि जावा के स्ट्रिंग ऑब्जेक्ट में सार्वजनिक रूप से स्थिर था, तो वस्तु का केवल 1 उदाहरण होगा ""

जैसे: -

String.EMPTY = ""; //Simply demonstrating. I realize this is invalid syntax

myVar0 = String.EMPTY;
myVar1 = String.EMPTY;
myVar2 = String.EMPTY;
myVar3 = String.EMPTY;
myVar4 = String.EMPTY;
myVar5 = String.EMPTY;
myVar6 = String.EMPTY;
myVar7 = String.EMPTY;
myVar8 = String.EMPTY;
myVar9 = String.EMPTY;

10 (11 String.EMPTY सहित) 1 ऑब्जेक्ट को इंगित करता है

या: -

myVar0 = "";
myVar1 = "";
myVar2 = "";
myVar3 = "";
myVar4 = "";
myVar5 = "";
myVar6 = "";
myVar7 = "";
myVar8 = "";
myVar9 = "";

10 ऑब्जेक्ट को 10 पॉइंटर्स

यह अक्षम है और एक बड़े अनुप्रयोग में, महत्वपूर्ण हो सकता है।

शायद जावा कंपाइलर या रन-टाइम एक ही उदाहरण के लिए "" के सभी उदाहरणों को स्वचालित रूप से इंगित करने के लिए पर्याप्त कुशल है, लेकिन यह उस निर्धारण को करने के लिए अतिरिक्त प्रसंस्करण नहीं कर सकता है।


9
गलत, stackoverflow.com/questions/1881922/… के अनुसार , स्ट्रिंग स्ट्रिंग से पुन: उपयोग किया जाएगा।
RealHowTo

1
मैंने कहा कि यह एक ही वस्तु का पुन: उपयोग कर सकता है और यदि ऐसा है, तो अभी भी कम कुशल है, क्योंकि इसे उस वस्तु (स्ट्रिंग पूल में) को खोजने की आवश्यकता है, इसलिए मैं कैसे गलत हूं? बावजूद, कई कारण हैं कि String.Empty बेहतर है, जिसमें myVar = "" जैसी त्रुटियों को रोकना शामिल है; और पठनीयता के साथ-साथ प्रदर्शन सुधार जो मैंने पहले ही कहा था। यदि किसी अन्य कारण से, स्ट्रिंग शाब्दिक बनाने के बजाय स्थिरांक का उपयोग करना अच्छा है; कोड को बनाए रखना आसान है।
एंटनी बूथ

1
मुझे संदेह है कि आपका प्रदर्शन तर्क मान्य है क्योंकि जेएलएस का कहना है कि एक निरंतर संकलन समय पर शाब्दिक माना जाएगा ( docs.oracle.com/javase/specs/jls/se7/html/jls-3.html#jls-3.10.10। 5 )। पठनीयता एक बेहतर तर्क है।
RealHowTo

3
@AntonySmith - मुझे लगता है कि आपको जावा का थोड़ा और अध्ययन करने की आवश्यकता है या शायद आप अब तक अपनी त्रुटि जानते हैं। जावा तार अपरिवर्तनीय और एक पूल में हैं। तो JVM में "" के लिए केवल एक स्ट्रिंग ऑब्जेक्ट है, चाहे वह कोड में कितनी भी बार मिला हो। आप यह जांच कर सकते हैं कि क्या करने से एक स्ट्रिंग खाली हैif (text == "")
अजो भाटिया

2
गलत। यह टिप्पणी हटा दी जानी चाहिए।
एलाड तबक
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.