tutorial - java verify




जावा में कोई स्ट्रिंग क्यों नहीं है। लक्षण? (6)

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

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

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

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


org.apache.commons.lang.StringUtils.EMPTY


अपाचे स्ट्रिंग इस समस्या को भी संबोधित करता है।

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

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

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


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

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

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

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

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

if ("".equals(text))

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

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

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


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

यदि आप वास्तव में एक EmptyString स्थिर चाहते हैं, तो इसे स्वयं बनाएं। लेकिन यह सब कुछ भी वर्बोज़ कोड को प्रोत्साहित करेगा; ऐसा करने के लिए कभी भी कोई फायदा नहीं होगा।


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

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

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

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

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

private static final String EMPTY_STRING = "";

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

TextBox.setText(EMPTY_STRING);

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





java