2009-08-14 7 views
39

अक्सर मैं जैसे एक वर्ग है:क्या मुझे शुरुआती जावा स्ट्रिंग मानों को शून्य से "" में सेट करना चाहिए?

public class Foo 
{ 
private String field1; 
private String field2; 

// etc etc etc 
} 

यह प्रारंभिक और field2 फ़ील्ड 1 के शून्य मानों पर समान बनाता है। क्या मेरे सभी स्ट्रिंग क्लास फ़ील्ड निम्नानुसार बेहतर होंगे?

public class Foo 
{ 
private String field1 = ""; 
private String field2 = ""; 

// etc etc etc 
} 

फिर, यदि मैं कक्षा परिभाषा के अनुरूप हूं तो मैं बहुत सारी पॉइंटर समस्याओं से बचूंगा। इस दृष्टिकोण के साथ क्या समस्याएं हैं?

+2

तो कुछ भी 'बुरा' नहीं होगा, मैं बस अपनी जावा शुद्धता स्थिति खो दूंगा? – Martlark

+0

एक त्रुटि तब मिल सकती है जब एक अप्रत्याशित स्ट्रिंग का उपयोग उभरा अपवाद के रूप में उपयोगी रूप से किया जाता है। लाभ के साथ आपका वेब ऐप आपको क्रैश और शर्मिंदा नहीं करता है। – Martlark

उत्तर

6

मैं अन्य पोस्टरों से असहमत हूं। खाली स्ट्रिंग का उपयोग स्वीकार्य है। जब भी संभव हो मैं इसका उपयोग करना पसंद करता हूं।

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

+0

क्या आप कृपया अपडेट कर सकते हैं यदि हमारे पास स्ट्रिंग जैसी सूची के अलावा संदर्भ चर है। एनपीई – Killer

+0

@ शुभम, अच्छी बात को रोकने के लिए उन्हें कुछ सूची ऑब्जेक्ट के साथ प्रारंभ करना चाहिए। एक संग्रह (सूची, सेट, मानचित्र) एक दूसरा मामला है जिसमें शून्य के बजाए 'खाली' संस्करण का उपयोग अक्सर समझ में आता है। व्यक्तिगत रूप से मैं पसंद करता हूं (उदाहरण के लिए) एक खाली संदर्भ में एक खाली सूची। –

48

बिलकुल नहीं। एक खाली स्ट्रिंग और एक नल स्ट्रिंग पूरी तरह से अलग चीजें हैं और आपको उन्हें भ्रमित नहीं करना चाहिए।

आगे व्याख्या करने के लिए:

  • "शून्य" का अर्थ है "मैं प्रारंभ नहीं इस चर, या यह कोई मूल्य नहीं है"
  • "रिक्त स्ट्रिंग" का अर्थ है "मुझे पता है कि मूल्य है, यह खाली है"।

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

+0

मैं सहमत हूं; हालांकि (सिर्फ शैतान के वकील होने के लिए) ऐसे लोग हैं जिनका उपयोग कमजोर टाइप सिस्टम के लिए किया जाता है जहां वे एक अपरिभाषित स्ट्रिंग वैरिएबल का उपयोग शुरू कर सकते हैं और इसे खाली माना जा सकता है। –

+0

सहमत हैं, लेकिन ऐसे कारण हैं जिनसे आप अपने तारों को शुरू करना चाहते हैं। पोस्टर को दोनों में अंतर समझाया जा सकता है। – doomspork

+4

@ क्रिस: लेकिन जावा एक कमजोर टाइप वाली भाषा नहीं है, इसलिए इसे आधे assed प्रयास से भी परेशान क्यों करें? – Tundey

1

मैं ऐसा करने से बचूंगा, आपको यह जानना होगा कि आपके उदाहरण डेटा के साथ सही तरीके से पॉप्युलेट नहीं हो रहे हैं या नहीं।

66

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

+5

+1, लेकिन एक चेतावनी: यदि आप डेटाबेस से अपनी ऑब्जेक्ट्स पॉप्युलेट कर रहे हैं, और वह डेटाबेस ओरेकल होता है, तो खाली स्ट्रिंग को शून्य के रूप में माना जाता है। हालांकि, स्पष्ट रूप से प्रारंभ करने के लिए "" उस मामले में आपकी मदद नहीं करेगा। – kdgregory

6

आम तौर पर इससे बचने के लिए सबसे अच्छा होगा। कारणों में से एक जोड़े:

  1. एक NullPointerException हो रही है आमतौर पर एक अच्छा चेतावनी है कि आप एक चर का उपयोग कर रहे इससे पहले कि आप होना चाहिए, या आप इसे स्थापित करने के लिए भूल गया कि। इसे एक खाली स्ट्रिंग पर सेट करने से NullPointerException से छुटकारा पड़ेगा, लेकिन संभवतः आपके प्रोग्राम में लाइन के नीचे एक अलग (और ट्रैक करने में कठोर) बग का कारण बन जाएगा।

  2. शून्य और "" के बीच एक वैध अंतर हो सकता है। एक शून्य मान आमतौर पर इंगित करता है कि कोई मान सेट नहीं किया गया था या मान अज्ञात है। एक खाली स्ट्रिंग इंगित करती है कि जानबूझकर खाली होने के लिए सेट किया गया था। आपके कार्यक्रम के आधार पर, वह सूक्ष्म अंतर महत्वपूर्ण हो सकता है।

7

यह वास्तव में मूल्य के लिए एक विशिष्ट मामले में कोई मतलब है इससे पहले कि यह कहीं और सेट किया गया है इस्तेमाल किया जा रहा है, और उस मामले में कोई रिक्त स्ट्रिंग के रूप में व्यवहार करने के लिए? यानी एक खाली स्ट्रिंग वास्तव में एक सही डिफ़ॉल्ट मान है, और क्या यह डिफ़ॉल्ट मान रखने के लिए समझ में आता है?

यदि उत्तर हाँ है, तो घोषणा में इसे सेट करना सही काम है। यदि नहीं, तो यह बग को खोजने और निदान करने के लिए कठिन बनाने के लिए एक नुस्खा है।

0

कोई रास्ता नहीं। तुम ऐसा क्यों करना चाहते हो। इससे गलत परिणाम मिलेगा। nulls और "" "समान नहीं हैं।

0

नल बेहतर है, यही कारण है कि उन्हें अनचेक अपवाद {शून्य सूचक अपवाद} कहा जाता है। जब अपवाद फेंक दिया जाता है, तो यह आपको बताता है कि आपको इसे कुछ गैर नल में प्रारंभ करना है । इस पर कोई तरीकों कॉल करने से पहले मूल्य

यदि आप करते हैं

निजी स्ट्रिंग फ़ील्ड 1 = "";

आपको त्रुटि को दबाने के लिए कोशिश कर रहे हैं यह बग को खोजने के लिए, बाद में कठिन है

।।
2

मैं न तो सुझाव दूंगा।

इसके बजाय आपको अपने क्षेत्रों को समझदार मूल्य देना चाहिए। अगर उन्हें बदलने की ज़रूरत नहीं है, तो मैं उन्हें अंतिम बना दूंगा।

public class Foo { 
    private final String field1; 
    private final String field2; 
    public Foo(String field1, String field2) { 
     this.field1 = field1; 
     this.field2 = field2; 
    } 
    // etc. 
} 

असाइन करने की कोई आवश्यकता नहीं है, मैं अभी तक शुरू नहीं किया गया है-अभी तक मान। बस इसे शुरुआती मूल्य दें।

2

मैं जानता हूँ कि यह एक पुराने सवाल है, लेकिन मैं निम्नलिखित कहना चाहता था:

String s = null; 

    s += "hello"; 
    System.out.println(s);// this will return nullhello 

जबकि

String s = ""; 

    s += "hello"; 
    System.out.println(s); // this will return hello 

स्पष्ट रूप से वास्तव में इस का जवाब है कि एक StringBuffer बल्कि सिर्फ का उपयोग करना चाहिए है समेकित स्ट्रिंग्स लेकिन जैसा कि हम सभी जानते हैं कि कुछ कोड के लिए यह एकसाथ आसान है।

+5

क्या अंतर है? वे मेरे लिए समान दिखते हैं। – Martlark

1

मुझे लगता है कि जब आप स्ट्रिंग एस = नल का उपयोग करते हैं तो यह केवल स्टैक पर परिवर्तनीय "एस" बनाएगा और ढेर पर कोई ऑब्जेक्ट मौजूद नहीं होगा, लेकिन जैसे ही आप चीजें जैसे स्ट्रिंग एस = "" घोषित करेंगे; यह क्या करेगा जैसे यह ढेर पर ऑब्जेक्ट बना देगा। जैसा कि हम जानते हैं कि स्ट्रिंग्स अपरिवर्तनीय हैं, इसलिए जब भी आप प्रत्येक बार विविधता को स्ट्रिंग करने के लिए नया मान निर्दिष्ट करेंगे तो यह ढेर पर नया ऑब्जेक्ट बनाएगा ... तो मुझे लगता है कि स्ट्रिंग एस = नल स्ट्रिंग एस = "" से कुशल है;

सुझाव स्वागत है !!!!!

+0

नहीं, जैसा कि स्ट्रिंग अपरिवर्तनीय है, जावा केवल एक बार ऑब्जेक्ट बनाने के लिए पर्याप्त स्मार्ट है और बस इसके लिए एक और संदर्भ देता है – jasg

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