2011-09-11 11 views
6

यह foo जो lookup द्वारा वापस किया गया है null हो सकता है।क्या इस जावा कोड को लिखने के लिए कोई और संक्षिप्त तरीका है?

है कारण है कि मैं पहले null अगर foo प्रत्यावर्तित करके null मूल्य पर foo.getFooStr() बुला से बचने के लिए कोशिश कर रहा हूँ कि null है।

लेकिन क्या यह लिखने के लिए एक बेहतर (अधिक संक्षेप) तरीका है?

public static String getFooStr(String input) 
{ 
    Foo foo = lookup(input); 
    if(foo==null) 
    { 
     return null; 
    } 
    return foo.getFooStr(); 
} 
+0

यह प्रश्न आपको कुछ अंतर्दृष्टि देने के लिए पर्याप्त (लेकिन समान नहीं) है: http://stackoverflow.com/questions/271526/how-to-avoid-null-statements-in-java –

+4

कुछ भी गलत नहीं है आपने जो लिखा है उसके साथ। इसे लिखना ताकि यह छोटा दिखता है, यह आवश्यक नहीं है। – Matt

+2

प्लस, स्ट्रिंग नल या नॉनल के मामले के लिए आप अलग-अलग पंक्तियों में ब्रेकपॉइंट्स ले सकते हैं। यह डीबगिंग के साथ मदद करता है। –

उत्तर

6

क्यों दिया गया lookup कि उचित foo स्ट्रिंग रिटर्न नहीं है?

+0

+1 हां यह लुकअप द्वारा किया जाना चाहिए। –

+2

+1 यह सबसे संक्षिप्त होगा। ;) –

34

आप दो सवाल है: वहाँ एक बेहतर तरह से कोड लिखने के लिए है, और वहाँ एक अधिक संक्षिप्त तरह से कोड लिखने के लिए है।

के बारे में अधिक संक्षिप्त, इस काम कर सकता था:

public static String getFooStr(String input) { 
    Foo foo = lookup(input);   
    return foo == null ? null : foo.getFooStr(); 
} 

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

+6

+1 आईएमएचओ कम कोड तब तक अच्छा है जब तक कि यह अभी भी स्पष्ट है, और यह है। बीटीडब्ल्यू, मैंने बेहतर पठनीयता के लिए ब्रैकेट शोर (यानी 'foo == null'' (foo == null) 'के बजाय हटा दिया - आशा है कि आपको कोई फर्क नहीं पड़ता। – Bohemian

+0

@ बोहेम: धन्यवाद! –

+5

@ बोहेम: एचएफओई ने इसे अच्छी तरह से कहा, क्या मायने रखता है ... आपके लिए समझना और डीबग करना आसान है ... और ताकि यह दूसरों द्वारा आसानी से समझा जा सके। आपके द्वारा हटाए गए "ब्रैकेट शोर" में से केवल उन लोगों के लिए शोर हो सकता है जो सी-जैसे ऑपरेटरों के व्याकरण को लगभग मातृभाषा के रूप में जानते हैं; कम अनुभवी लोगों के लिए (जो बहुत अधिक लोग हैं, लेकिन आपके दर्शक नहीं हो सकते हैं), कोष्ठक इसे और अधिक पठनीय बनाते हैं, क्योंकि उन्हें यह नहीं पता होना चाहिए कि '?:' '==' की तुलना में अधिक प्राथमिकता है या नहीं। मैं यह नहीं कह रहा हूं कि आप माता-पिता को हटाने में गलत हैं, लेकिन वे शोर नहीं हैं, और मैं उन्हें अधिक छोड़ दूंगा। – LarsH

3

मैं जावा में नहीं हूं, लेकिन मुझे साफ कोड पसंद है ... स्रोत कोड मनुष्यों के लिए पढ़ने और समझने में आसान होना चाहिए - मशीन परवाह नहीं है कि यह कैसा दिखता है लेकिन आपके सहयोगी क्या करते हैं। अधिक संक्षिप्त कोड आमतौर पर समझने के लिए एक पल या दो लंबा होता है (कभी-कभी मात्रा और जटिलता के आधार पर बहुत अधिक लंबी अवधि)। कोड को समझने योग्य रखें और यह रखरखाव योग्य होगा (भले ही यह थोड़ा और वर्बोज़ हो)!

3

Groovy does it nicer

return lookup(input)?.fooStr

or even just:

lookup(input)?.fooStr

+0

वापसी की आवश्यकता नहीं है ;-) – Steven

+0

बहुत सच @Steven, धन्यवाद! अपडेट किया गया। –

2

जावा 7, कुछ बिंदु पर यह योजना बनाई गई थी कि आप बस लिख सकते के लिए:

public static String getFooStr(String input) 
{ 
    Foo foo = lookup(input); 
    return foo?.getFooStr(); 
} 

लेकिन जब तक इस सुविधा का व्यापक रूप से है ज्ञात है, आपको ?: ऑपरेटर से चिपके रहना होगा।

+0

क्या यह वर्तमान में जावा 7 में उपलब्ध है, यदि कोई हो तो कृपया लिंक करें। मुझे इस पर पढ़ने में दिलचस्पी होगी। –

+0

यह सुविधा जावा 7 में नहीं मिली है और मुझे संदेह है कि इसे जल्द ही जोड़ा जाएगा। हालांकि सी # स्पष्ट रूप से यह है ;-) – Voo

+4

एल्विस ऑपरेटर को 200 9 में जावा 7 से हटा दिया गया था। परियोजना कोन साइट यह कहती है: * "जबकि एल्विस ऑपरेटर और संबंधित ऑपरेटर ग्रोवी में सहायक हैं, ग्रोवी और जावा के बीच अंतर, जैसे कि बॉक्सिंग/अनबॉक्सिंग के साथ आदिम प्रकारों और इंटरैक्शन की उपस्थिति जावा में कम उपयोगी ऑपरेटरों को प्रस्तुत करती है। जेडीके 7 जेएसआर 308 द्वारा सक्षम नल जांच जैसे शून्य-हैंडलिंग के दर्द को कम करने के अन्य तरीकों का समर्थन करेगा। "* (जेएसआर 308 प्रकार है एनोटेशन, और जिसे जेडीके 8 में स्थानांतरित कर दिया गया है) –

1

मुझे किसी भी कोड में कहीं भी एकाधिक रिटर्न पसंद नहीं है। मैं बस से मछली के @Hovercraft पूर्ण मेरी राय में अच्छा लेकिन कम पढ़ी जा सकती है, लेकिन अभी भी संस्करण करने का एक आम तरीका

public static String getFooStr(String input) 
{ 
    Foo foo = lookup(input); 
    String fooString; 
    if(foo!=null) 
    { 
     fooString = foo.getFooStr(); 
    } 
    return fooString; 
} 

इसके अलावा करने के लिए इसे बदल जाएगा।

+5

यदि आपको एकाधिक रिटर्न पसंद नहीं हैं, तो कृपया 'थ्रोबल' पर नज़र डालें। –

+0

यदि उपरोक्त कोड पर्याप्त स्पष्ट नहीं है तो आपको कोडिंग नहीं किया जाना चाहिए @EricLindauer –

+0

@EricLindauer क्या आपने मुझे कम किया है? –

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