जब स्ट्रिंग स्ट्रिंग की तुलना एक स्ट्रिंग शाब्दिक के साथ असमान () के साथ की जाती है, तो क्या वस्तुओं के क्रम के लिए एक मानक अभ्यास है? [बन्द है]


11

प्रत्येक के लिए लाभ हैं और मैं मतभेदों को समझता हूं, लेकिन सबसे अच्छा / मानक अभ्यास क्या माना जाता है? और क्यों?

उदाहरण के लिए :

"myString".equals(myStringVar)
  • एक संभावित एनपीई से बचा जाता है और एक अशक्त जांच की आवश्यकता नहीं होती है। (अची बात है?)
  • एक नल की जांच के बाद से क्लीनर को पढ़ने की आवश्यकता नहीं है।
  • यदि अशक्त अपेक्षित मूल्य नहीं है, तो आपका प्रोग्राम बिना समझदारी के तोड़ा जा सकता है।

तथापि

myStringVar.equals("myString")
  • शून्य चेक की आवश्यकता है यदि शून्य अपेक्षित मान है। (अची बात है?)
  • अशक्त जाँच के साथ यौगिक स्थिति को अव्यवस्थित कर सकते हैं।
  • NPE के लिए अनुमति देता है कि हमें पता है कि कुछ टूट गया है।

कौन सी भिन्नता जावा के लिए उपयोग करने के लिए मानक माना जाता है, और क्यों?


2
शून्य एक अपेक्षित मूल्य है या नहीं, क्या "बराबर" ऑपरेशन को यह निर्धारित करने के लिए जगह होनी चाहिए कि यह समस्या है?
मैथ्यू फ्लिन

मुझे नहीं लगता कि यह है। लेकिन यह मेरी राय है। मैं दूसरों का तर्क सुनना चाहूंगा।
ब्रैंडनवी

असाइनमेंट / तुलना के लिए = और / या == का उपयोग करने वाली भाषाओं में, यह सामान्य रूप से सबसे अच्छी बात है कि वह चीज़ जो बाईं ओर नहीं बदल सकती है ताकि आप एक आकस्मिक असाइनमेंट न कर सकें जब आप तुलना करने का मतलब था। उन भाषाओं के लिए, जो किसी ऑब्जेक्ट पर विधियों का उपयोग करती हैं, जैसे-मुझे लगता है कि यह मायने नहीं रखती है।
गॉर्डन

जवाबों:


3

मुझे संदेह है कि यह पुराने C (या C ++) में प्रोग्रामिंग करते समय उपयोग किए जाने वाले सुरक्षा एहतियात से उत्पन्न होता है। सी में, आप गलती से एक मूल्य असाइन कर सकते हैं जब आप समानता का परीक्षण करने का मतलब रखते हैं:

if (x = 3)

यह स्थिति हमेशा सही रहेगी, क्योंकि यह 3 का असाइनमेंट xa मान है, यह परीक्षण नहीं है कि x 3 के बराबर है। इस सूक्ष्म कीड़े से बचने के लिए, डेवलपर्स ने स्थिति को उलटना शुरू कर दिया:

if (3 = x)

इसमें समान "बग" शामिल है, लेकिन एक संकलक त्रुटि उत्पन्न करेगा, इसलिए यह अधिक सुरक्षित है।

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


-1 यह जावा कन्वेंशन का कारण नहीं है equals। सी के विपरीत, जावा के लिए समस्या यह है कि अभिव्यक्ति शून्य x.equals(y)होने पर एनपीई फेंक देगी x। यदि आपके पास एक स्ट्रिंग शाब्दिक है "something"और आप मामले nullको "बराबर नहीं" के रूप में विचार करना चाहते हैं , तो यह लिखने के लिए समझ में आता है "something".equals(y)कि क्या आप नहीं जानते कि क्या yअशक्त हो सकता है। यह कभी भी एनपीई नहीं फेंकेगा।
एंड्रेस एफ।

1
  • आप जिस संस्था के लिए काम कर रहे हैं उसकी संस्कृति के साथ मानक और अच्छा अभ्यास अलग-अलग होगा

  • .NET में हमारा मानक myStringVar == "myString"केवल इसलिए है क्योंकि हम इस पर सहमत हुए हैं, अर्थात हम इसे साफ और संक्षिप्त मानते हैं

नोट: यह जावा पर लागू नहीं होता है क्योंकि ==वस्तुओं के बजाय संदर्भों की तुलना स्वयं की जाती है। जावा में आपको उपयोग करना चाहिए myStringVar.equals("myString")


3
कम से कम जावा में, उपयोग न करें ==क्योंकि यह केवल ऑब्जेक्ट संदर्भों की तुलना करता है। कहा कि, +1 के सेटिस्फेक्शन के लिए - कन्वेंशन अक्सर चीजों को करने के "सही" तरीके को परिभाषित करता है।
माइकल के

इस बारे में बताने के लिए शुक्रिया! मैंने उत्तर अपडेट किया है :)
CodeART

@ कोडकोड: मुझे लगता है कि आपने माइकल की बात को याद किया। इसके अलावा, यह जावा नहीं जावा है।
अमारा

प्रश्न था: "लेकिन क्या सबसे अच्छा / मानक अभ्यास माना जाता है? क्यों?" मेरा जवाब है कि मानक और सर्वोत्तम अभ्यास एक संगठन से दूसरे में भिन्न होता है। क्या आप इससे असहमत हैं?
कोडार्ट

@ कोडकोड: कोई भी इससे सहमत नहीं हो सकता है, कोडवर्क। लेकिन हर कोई इस बात से सहमत हो सकता है कि myStringVar == "myString"जावा पर एक गहरा बुरा विचार है (जब तक कि आप निश्चित रूप myStringVarसे नजरबंद नहीं हैं)।
अमारा

0

मुझे लगता है कि आप सही हैं कि यह चर के शून्यता शब्दार्थ पर निर्भर करता है। यदि आप इसे शून्य होने की उम्मीद नहीं करते हैं और इसे जांचना और संभालना नहीं है तो पहला रूप क्लीनर है।

कहा कि, स्ट्रिंग शाब्दिक को एम्बेड करने के बजाय, एक बेहतर विकल्प शायद यही होगा:

private final String MY_STRING = "myString";
if(MY_STRING).equals(myStringVar);

खासकर यदि एक से अधिक स्थानों पर स्ट्रिंग का उपयोग करने की क्षमता है।


2
-1: वास्तव में बेहतर नहीं; आम तौर पर नगण्य मूल्य के साथ अव्यवस्था जोड़ता है
अमारा

@sparkleshy - असहमत, आप वास्तव में अपने कोड तर्क के माध्यम से छिड़का हुआ स्ट्रिंग शाब्दिक नहीं चाहते हैं। जैसा कि मूल उत्तर में उल्लेख किया गया है, यदि स्ट्रिंग शाब्दिक का उपयोग एक से अधिक स्थानों पर किया जाता है, तो मैं निश्चित रूप से उन्हें बाहर निकालने के लिए कहूंगा।
बेंजामिन वूटन

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