क्या StringUtils.EMPTY की सिफारिश की गई है?


91

क्या आप StringUtils.EMPTYइसके बजाय उपयोग करते हैं ""?

मेरा मतलब या तो रिटर्न वैल्यू के रूप में है या यदि आप स्ट्रिंग वेरिएबल का मान सेट करते हैं। मैं तुलना के लिए मतलब नहीं है, क्योंकि वहाँ हम का उपयोग करेंStringUtils.isEmpty()

जवाबों:


111

बिलकूल नही। क्या आप वास्तव में सोचते हैं कि "" पर्याप्त स्पष्ट नहीं है?

स्थिरांक में अनिवार्य रूप से 3 उपयोग के मामले हैं:

  1. मान का अर्थ दस्तावेज़ (स्थिर नाम + javadoc के साथ)
  2. एक सामान्य मूल्य पर ग्राहकों को सिंक्रनाइज़ करें।
  3. कुछ init लागत से बचने के लिए एक विशेष मूल्य का शॉर्टकट प्रदान करें

यहां कोई भी आवेदन नहीं करता है।


33
मैं अभी भी एक के लिए एक मामूली और दुर्लभ उपयोग मामला देखता हूं StringUtils.EMPTY। यह स्पष्ट करता है कि खाली स्ट्रिंग के उपयोग का इरादा है, न कि किसी प्रकार का आलस्य ("ओह, इसके लिए एक स्ट्रिंग की आवश्यकता है, चलो पास """)। यदि कोई इस कोड को हिट करता है, तो वह बदलाव करने से पहले दो बार सोचेंगे। इसके अलावा, यदि StringUtils.EMPTYआपके स्वयं के चर के रूप में परिभाषित किया गया है, जैसे MyClass.EMPTY, "उस खालीपन का प्रतिनिधित्व" करने के लिए परिवर्तन करना कोड की एक पंक्ति को बदलने की आवश्यकता होगी। उदाहरण के लिए, आप "<empty>"खाली स्ट्रिंग के बजाय इसे बदल सकते हैं ""। लेकिन, मुझे लगता है कि यह बहुत दूर जा रहा है।
टिम्मोस

5
अंत में मेरे पास हर बार सोचने के बजाय उत्साह को आगे बढ़ाने के लिए कुछ समझदार तर्क हैं। धन्यवाद।
एलेक्स

2
EMPTY का अर्थ कैसे होता है? EMPTY आपकी सूची में 1 और 2 दोनों को संतुष्ट करता है। अनुभवी डेवलपर्स गंभीर रूप से जूनियर डेवलपर्स के लिए "" का उपयोग करते हुए कुछ गड़बड़ करने की क्षमता को कम करके आंका जा रहा है।
एंड्रयू टी फिनेल

4
@AndrewTFinnell नाम का EMPTYकोई मतलब नहीं है जो खाली स्ट्रिंग के पास पहले से नहीं है। सबसे विशेष रूप से, यह दस्तावेज नहीं करता है कि आपने उस विशेष मामले में खाली स्ट्रिंग का उपयोग करने का निर्णय क्यों लिया। यह एक स्थिर का नामकरण करने के लिए अलग नहीं है ONEऔर दिखावा है कि मूल्य के बजाय उस निरंतर का उपयोग करने में एक बिंदु था।
होल्गर

6
डाउन वोट सिर्फ इसलिए, नहीं, मुझे वास्तव में नहीं लगता कि "" पर्याप्त स्पष्ट है :( क्या यह खाली है? क्या यह खाली है? क्या इसमें कोई जगह है जो मैं नहीं देख सकता क्योंकि मेरा फ़ॉन्ट आकार छोटा है? क्या यह इरादा था? खाली हो? क्या कोई अजीब "अदृश्य" वर्ण हैं?
दान रेसन

60

मैं उपयोग करता हूं StringUtils.EMPTY, शाब्दिक रूप से छिपाने के लिए और यह भी व्यक्त करने के लिए कि return StringUtils.EMPTYपूरी तरह से उम्मीद थी और एक खाली स्ट्रिंग वापस आनी चाहिए, ""इस धारणा को जन्म दे ""सकती है जिसे आसानी से किसी और चीज में बदला जा सकता है और यह शायद केवल एक गलती थी। मुझे लगता है कि EMPTYयह अधिक स्पष्ट है।


37
अन्य लोगों के अनुसार जिन्होंने यह सुझाव दिया है: क्या आप 0 के लिए शून्य और 1 के लिए भी उपयोग करते हैं?
जॉन स्कीट

9
मैं पूर्णांक शाब्दिक के उपयोग के लिए विशेष 'खाली' मामले की तुलना नहीं करूंगा।
क्रिस्टोफर क्लेव्स

16
मैं तुलनात्मक रूप से StringUtils.EMPTY कम अभिव्यंजक पाता हूं ""
बैकर

1
@JonSkeet आपका बहुत सम्मान करते हैं। मुझे लगता है कि आप यहाँ गलत हैं। जब आप और मैं इसका कभी सामना नहीं कर सकते हैं, तो शाब्दिक "" का उपयोग नहीं करने के लिए एक मामला होना चाहिए क्योंकि यह कोई सिंटैक्स चेकिंग प्रदान करता है यदि कोई डेवलपर इसे गड़बड़ करता है। और हाँ, मैंने देखा है कि जूनियर डेवलपर्स ने "" जैसी सरल चीजों को गड़बड़ कर दिया है। मैं कभी नहीं बदलने के विचार में खरीदने का मतलब है कि "" की तुलना में कुछ और मतलब है। मैं केवल इस तथ्य के लिए ईएमपीटीवाई के विचार को पसंद करता हूं कि कंपाइलर इसे समझने में सक्षम है।
एंड्रयू टी फिनेल

@AndrewTFinnell: "गलत" एक अजीब शब्द है जिसे निश्चित रूप से व्यक्तिपरक होना चाहिए। नहीं, मैं कभी भी अर्थ बदलने की उम्मीद नहीं करता हूं, लेकिन मैं - जैसे बेकर - का उपयोग ""करने की तुलना में अधिक अभिव्यंजक StringUtils.EMPTYलगता हूं, और आपने जो कहा है, उस पर मेरा मन नहीं बदला है। मैं सिर्फ इस बारे में विश्वास कर सकता हूं कि डेवलपर्स ने गलत स्ट्रिंग लिटरल को बहुत, कभी - कभार लिखा है - लेकिन मैं एक बार में मिलियन में (और आसानी से परीक्षण में पाया गया, उम्मीद है कि स्ट्रिंग स्ट्रिंगल की स्पष्टता लूंगा) ) बग, व्यक्तिगत रूप से।
जॉन स्कीट

29

नहीं, बस उपयोग करें ""

""क्रिस्टल के रूप में शाब्दिक स्पष्ट है। कोई गलतफहमी नहीं है कि क्या मतलब था। मुझे नहीं पता कि आपको इसके लिए एक वर्ग स्थिरांक की आवश्यकता क्यों होगी। मैं केवल यह मान सकते हैं कि यह लगातार युक्त पैकेज प्रयोग किया जाता है StringUtilsके बजाय ""। इसका मतलब यह नहीं है कि आपको इसका उपयोग करना चाहिए, हालांकि।

यदि फुटपाथ पर चट्टान है, तो आपको उसे फेंकने की जरूरत नहीं है।


6
"अगर फुटपाथ पर चट्टान है, तो आपको उसे फेंकने की ज़रूरत नहीं है।" मेरे 6 साल के बेटे को बताओ।
रोली

14

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


4
मैं उत्सुक हूँ - क्या आपने कभी कोड में ऐसा होते देखा है? यदि हां, तो क्या यह आकस्मिक या उद्देश्य पर था? यह आकस्मिक रूप से करना मुश्किल होगा, और यदि उद्देश्य पर, अच्छी तरह से मैं आसानी से एक गैर-खाली ईएमपीटीवाई के साथ आसानी से अपना स्वयं का स्ट्रिंग क्लास बना सकता हूं, और इसका उल्लेख कर सकता हूं।
इयान रॉबर्टसन

5
@ इयान रॉबर्टसन हां, मैंने ऐसा होते देखा है। अक्सर वास्तव में। लोग हर समय और एक कोड सेट से दूसरे कोड सेट पर वेबसाइटों से कट और पेस्ट करते हैं। ऐसी कंपनियां भी हैं जो अभी भी क्लियर केस का उपयोग करती हैं, जो एक पुरातन कोड सेट का उपयोग करती हैं, जिसे तब आँख बंद करके आईएसओ सेट में अनुवाद किया जाता है, और उसके बाद यूटीएफ -8 में अनुवाद किया जाता है यदि आप गिट में जाते हैं। मैंने कोड सेट की समस्याओं को हल करने में अनगिनत घंटे बिताए हैं। जिसमें यह भी शामिल है।
एंड्रयू टी फिननेल

3
@AndrewTFinnell मैं निश्चित रूप से सामान्य रूप से देख सकता हूं, जो मुद्दों का कारण बन सकता है। लेकिन आपने कितनी बार विशेष रूप से एक गैर-खाली खाली दिखने वाले स्ट्रिंग स्थिर देखा है?
इयान रॉबर्टसन

13

मैं अपने दो सेंट यहाँ जोड़ूंगा क्योंकि मैं किसी को Stringइंटर्न और क्लास इनिशियलाइज़ेशन के बारे में बात करते हुए नहीं देखता :

  • सभी Stringजावा स्रोतों में शाब्दिक, प्रशिक्षु कर रहे हैं किसी भी "" और एक ही वस्तुStringUtils.EMPTY
  • वर्ग StringUtils.EMPTY को इनिशियलाइज़ कर सकते हैंStringUtils , क्योंकि यह अपने स्टेटिक मेंबर को EMPTY तभीfinal एक्सेस करता है, जब वह घोषित नहीं होता है (उस बिंदु पर JLS विशिष्ट है)। हालाँकि, यह अंतिम है, इसलिए यह कक्षा को प्रारंभ नहीं करेगा।org.apache.commons.lang3.StringUtils.EMPTY

स्ट्रिंग इंटर्निंग पर और क्लास इनिशियलाइज़ेशन पर , JLS 12.4.1 का उल्लेख करते हुए संबंधित उत्तर देखें ।


"केवल अगर इसे अंतिम घोषित नहीं किया जाता है", तो चूंकि यह क्षेत्र अंतिम घोषित किया गया है, इसलिए इसे एक्सेस करने से कक्षा के आरंभ का कारण नहीं बन सकता है StringUtils
होल्गर

@ होलगर जो एक सामान्य कथन था लेकिन वास्तव में, मैंने इसे लिंक के साथ एडवांटेज के साथ एड करके दिखाया कि यह अंतिम है (और इस तरह यह क्लास को इनिशियलाइज़ नहीं करेगा)।
Matthieu

8

मैं वास्तव में इसका इस्तेमाल नहीं करना चाहता, जैसा return "";कि इससे कम है return StringUtils.EMPTY

हालांकि, इसका उपयोग करने का एक गलत फायदा यह है कि यदि आप return " ";इसके बजाय टाइप करते हैं return "";, तो आप विभिन्न व्यवहार का सामना कर सकते हैं (यदि आप सही ढंग से खाली स्ट्रिंग का परीक्षण करते हैं या नहीं) के बारे में।


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

2
@ जो नहीं, वास्तव में, लेकिन मैंने इसका उपयोग करने का एक फायदा खोजने की कोशिश की;)
रोमेन लिंसोलस ४'११० ४१११

1
कोई समान समय नियम नहीं है। अगर कोई फायदा नहीं है, तो कोई फायदा नहीं है।
एरिक रॉबर्टसन

1
मुझे यह ""भी पसंद नहीं है , मैं एक ही समय में एक ही बार में एक ही शाब्दिक स्ट्रिंग टाइप करने से नफरत करता हूं, यहां तक ​​कि कभी-कभी ही। मैं लगातार कॉन्स्टेंट्स.जाव में स्थिरांक घोषित करता हूं , लेकिन उन्हें स्रोत कोड में हर जगह दोहराता नहीं हूं।
賈 जैकी

2
मैं लगता है कि return ""; बदसूरत है, मैं पसंद करते हैं वापसी उपयोग करने के लिए StringUtil.EMPTY(अपने ही वर्ग में घोषित StringUtil , नहीं अपाचे के StringUtils )।
賈 जैकी

5

यदि आपकी कक्षा कॉमन्स से कुछ और उपयोग नहीं करती है, तो यह इस जादुई मूल्य के लिए इस निर्भरता के लिए एक दया होगी।

StringUtils का डिज़ाइनर इस स्थिरांक का भारी उपयोग करता है, और यह सही काम है, लेकिन इसका मतलब यह नहीं है कि आपको इसका भी उपयोग करना चाहिए।


मेरा मतलब था कि यह स्वीकार्य है क्योंकि लेखक ने इस तरह से जाना ("जादुई मूल्यों" के किसी भी उपयोग से बचें)। हालांकि यह निजी होना चाहिए।
चेरोविम

लेखक कोड में 0 का अक्सर उपयोग करता है। क्या यह उनके लिए बेहतर होगा कि वे एक निरंतर int ZERO = 0 को परिभाषित करें? यदि नहीं, तो क्या अंतर है?
जॉन स्कीट

6
ये संदर्भ पर निर्भर करता है। यदि यह एक FCKEditorStringUtils था, तो उनका EMPTY "<p> & nbsp </ p>" होगा और मैं देखूंगा कि कक्षा में हर जगह इस जादुई मूल्य को दोहराने के बजाय EMPTY का पुन: उपयोग किया जाता है। इसलिए, EMPTY से उनका मतलब है कि शायद EMPTY_CONTENT और EMPTY_STRING नहीं है (इसलिए आपका शून्य उदाहरण थोड़ा अनुचित है)। क्या आप किसी ERROR_VISA_INVALID = 0 स्थिरांक का पुनः उपयोग नहीं करेंगे?
चेरोविम

1

ईमानदारी से, मुझे इसका अधिक उपयोग नहीं दिखता। यदि आप खाली स्ट्रिंग की तुलना करना चाहते हैं, तो उपयोग करेंStringUtils.isNotEmpty(..)


2
StringUtils.isNotEmpty(..)यह भी एक रिक्त स्ट्रिंग के साथ तुलना के रूप में एक ही नहीं है तो यह एक अशक्त करता है।
चेरोविम

और आप कैसे प्रचार करेंगे null? 2 के तर्क के रूप में equals, लेकिन परिणाम वही होगा -false
Bozho

isNotEmptyके विपरीत है "".equals(…), इसलिए, तथ्य यह है कि यह व्यवहार करेगा nullरिक्त स्ट्रिंग की तरह है एक खाली स्ट्रिंग, के साथ तुलना करने के लिए विभिन्न "".equals("")true, "".equals(null)false, StringUtils.isNotEmpty("")false, StringUtils.isNotEmpty(null)false। यदि आप यह जानना चाहते हैं कि क्या एक स्ट्रिंग खाली है, तो उपयोग करें string.isEmpty(), जिसमें trueiff लौटाने का सही व्यवहार है, यह एक रिक्त स्ट्रिंग है और NullPointerExceptionयदि स्ट्रिंग है तो फेंकना null...
Holger

1

मैं StringUtils.EMPTYकुछ मामलों में उपयुक्तता के लिए उपयोगी पाता हूं । विशेष रूप से:

  1. टेनरी संचालक उदा।

    item.getId() != null ? item.getId() : StringUtils.EMPTY;
    
  2. एक विधि से खाली स्ट्रिंग लौटना, यह पुष्टि करने के लिए कि हाँ मैं वास्तव में ऐसा करना चाहता था।

निरंतर का उपयोग करके भी, एक संदर्भ StringUtils.EMPTYबनाया जाता है। अन्यथा यदि आप ""हर बार स्ट्रिंग शाब्दिक को तुरंत करने की कोशिश करते हैं , तो जेवीएम को यह जांचना होगा कि क्या वह स्ट्रिंग पूल में पहले से मौजूद है (जो कि इसकी संभावना है, इसलिए कोई अतिरिक्त उदाहरण ओवरहेड नहीं है)। निश्चित रूप StringUtils.EMPTYसे स्ट्रिंग पूल की जांच करने की आवश्यकता से बचा जाता है?


4
एकाधिक लुकअप के साथ आपका तर्क होल्ड नहीं करता है। जावा लैंग्वेज स्पेसिफिकेशन 3.0 के अध्याय 13.4.9 में, यह उल्लेख किया गया है कि StringUtils.EMPTYनिरंतर को संकलन-समय पर हल किया जाता है।
रोलैंड इलिग

4
स्ट्रिंग पूल में अस्तित्व को संकलित समय और कक्षा लोडिंग समय पर जांचा जाता है, रनटाइम पर कभी भी ऐसा समय नहीं है जब आप इस तरह के बयान को अंजाम देते हैं,
लोर्न की

1
चूंकि StringUtil.EMPTYएक संकलन-समय स्थिर है, इसका एक संदर्भ ""सीधे उपयोग के रूप में ठीक उसी बायोटेक के लिए संकलित हो जाता है । इसके अलावा, मैं यह नहीं देखता कि टर्नरी ऑपरेटर को कोई अंतर क्यों करना चाहिए। यह किसी अन्य की तरह एक अभिव्यक्ति है। नामांकित स्थिरांक का उपयोग करने या न करने का कोई कारण टर्नरी ऑपरेटर पर भी लागू होता है।
होल्गर

1

नहीं, क्योंकि मुझे लिखना अधिक है। और एक खाली स्ट्रिंग, प्लैटफ़ॉर्म स्वतंत्र रिक्त (जावा में) है।

File.separator "/" या "\" से बेहतर है।

लेकिन जैसा चाहो वैसा करो। आपको एक टाइपो नहीं मिल सकता हैreturn " ";


7
मुझे समझ में नहीं आता है कि अधिकांश प्रोग्रामर "बहुत ज्यादा" लिखने से क्यों डरते हैं। StringUtils.EMPTY लिखकर आप सेल्फ कमेंटिंग कोड प्राप्त करेंगे, जिसे पढ़ना आसान है। और स्टीव मैककोनेल के अनुसार (या कुछ अध्ययन जो उन्होंने कोड कम्प्लीट 2.0 में उद्धृत किया था) कोड को 7 से अधिक बार पढ़ा गया है।
पावेल डिडा

1
आप विशेष रूप से सही हैं, लेकिन: "" .equals (someString) StringUtils.EMPTY.equals (someString) के रूप में पढ़ना उतना ही आसान है
क्रिश्चियन कुटेबैक

यदि आप इसे गलत लिखते हैं, तो StringUtils.EMPTY.equals (someString) एक सिंटैक्स त्रुटि का परिणाम होगा। ""। असमान (someString) नहीं होगा। EMPTY का उपयोग करने के लिए केवल एक ही कारण है।
एंड्रयू टी फिनेल जूल 27'18

1
@AndrewTFinnell यही कारण है कि समझदार प्रोग्रामर someString.isEmpty()इसके बजाय लिखते हैं।
होल्गर

-2

हाँ, यह समझ में आता है। यह जाने का एकमात्र तरीका नहीं हो सकता है लेकिन मैं इसे "समझ में नहीं आता" कहने के तरीके में बहुत कम देख सकता हूं।

मेरी राय में:

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

It will still require changing everywhere if you don't define your own variable and use it in multiple places.आप एक खाली स्ट्रिंग को एक अलग स्ट्रिंग में बदलने जा रहे हैं?
चिता

@Pita क्षमा करें, वह बेचारा प्रतिगामी था। मेरे कहने का मतलब है कि यदि आप "" के बजाय इस इनलाइन का उपयोग करते हैं तो भी आपको अपने स्वयं के निरंतर को परिभाषित करने और कई स्थानों पर पुन: उपयोग करने के समान लाभ नहीं मिलते हैं। यह StringUtils.EMPTY के लिए एक तर्क नहीं है, यह एक स्पष्टीकरण है कि आपको बहुत कुछ नहीं मिलता है भले ही यह 'समझ में आए'। व्यक्तिगत रूप से, मैं एक वर्णनात्मक नाम के साथ एक स्थिरांक बनाऊंगा और फिर इसे निर्दिष्ट करूंगा। मैंने कुछ मामले देखे हैं जहाँ एक डेवलपर ने एक ही स्थान का इरादा किया है और एक खाली स्ट्रिंग के साथ समाप्त हुआ है, जो इस फॉर्म के साथ नहीं होता है।
ओरोन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.