2008-11-10 12 views
7

के रूप में 'enum` बनाम' स्ट्रिंग` मैं System लाइब्रेरी set और विधियों के विवरणों के माध्यम से पढ़ रहा हूं अभी तक पैरामीटर आमतौर पर स्ट्रिंग्स हैं।जावा: पैरामीटर

क्या आप enum को शामिल करने के बाद से String पैरामीटर खराब अभ्यास के रूप में उपयोग करेंगे?

न्यूनतम पर एक बेहतर विकल्प public final String हो सकता है, नहीं?

उत्तर

18

मैं मानकों को स्ट्रिंग्स की तुलना में बेहतर दृष्टिकोण मानता हूं। वे सुरक्षित हैं और उन्हें तुलना करना स्ट्रिंग्स की तुलना में तेज़ है।

पूर्व जावा 1.5 विकल्प के रूप में आप अपनी पुस्तक इफेक्टिव जावा में जोशुआ ब्लोच द्वारा सुझाए गए प्रकार-सुरक्षित एनम पैटर्न का उपयोग कर सकते हैं। टाइप-सेफ एनम्स के लिए भी देखें http://www.javacamp.org/designPattern/enum.html

3

मैंने "कम से कम आश्चर्य की विधि" सीखी है। सहज रूप से, enum का उपयोग सही बात है। तो मैं इसके लिए जाऊंगा। मुझे यकीन है कि जावा निर्माता एक जैसे सोचते हैं।

संपादित: परास्नातक के उत्कृष्ट स्पष्टीकरण: http://benpryor.com/blog/2006/06/29/api-design-the-principle-of-least-surprise/

5

सिर्फ इसलिए कि आप यह घोषणा एक public final String कुछ के रूप में आप एक पैरामीटर के रूप में एक विधि में पारित किया है की उम्मीद है, वहाँ मुझे मुझे पसंद है कुछ भी में पारित करने से रोक रहा है कुछ भी नहीं है।

enum का उपयोग करना मतलब है कि मैं इस मुद्दे के दोनों पक्षों की रक्षा करने के लिए अपना स्वयं का ऑब्जेक्ट नहीं बना सकता। एकमात्र समय मैं सोच सकता हूं कि आपको enums के बदले निरंतर स्ट्रिंग का उपयोग करना चाहिए, यदि आपको कस्टम कार्यक्षमता को सक्षम करने के लिए उपयोगकर्ता को अपनी विधि का विस्तार करने की अनुमति देने की आवश्यकता है ...

+0

@ मार्टिन: मैं स्ट्रिंग कॉन्स में इनपुट की तुलना करने की सोच रहा हूं अन्यथा अमान्य इनपुट अपवाद फेंक रहा हूं, अच्छा नहीं। मैंने खुली चाबियों के सुझाव के कारण सवाल पूछा, ऐसा लगता है कि जावा के भीतर वर्वा अवधारणा को कम करना है। –

4

यदि आप System.setProperty का जिक्र कर रहे हैं(), System.getProperty(), या System.getenv(), मुझे लगता है कि स्ट्रिंग्स उचित हैं क्योंकि संभव कुंजी के सेट खुले हैं। मुख्य पैरामीटर किसी फ़ाइल या स्टोर में किसी वास्तविक टेक्स्ट/स्ट्रिंग प्रकार मान से मेल खाता है।

यदि आपके पास चाबियों का एक बंद सेट है, तो मुझे लगता है कि enums को अधिक पसंद किया जाएगा।

+0

इस पर मेरा विचार था कि एक एनम में गैर प्लेटफार्म विशिष्ट सेटिंग्स के लिए मैपिंग विवरण हो सकते हैं, दोनों को केवल स्ट्रिंग्स का उपयोग नहीं किया जाना चाहिए, और उस स्ट्रिंग विधियों को अवमूल्यन को गोद लेने के लिए प्रोत्साहित किया जाना चाहिए –

+0

मुझे लगता है कि "बंद" के बीच भेद चाबियाँ और "खुली" चाबियाँ यहां सबसे महत्वपूर्ण कारक हैं। यदि आप गतिशील रूप से लोड किए गए प्लगइन वाले एपीआई को देखते हैं, तो प्लगइन अतिरिक्त कार्यक्षमता में योगदान दे सकते हैं जिसे स्ट्रिंग पैरामीटर के माध्यम से एक्सेस किया जा सकता है, लेकिन एक enum के साथ और अधिक कठिन होगा। –

0

मौजूदा एपीआई में तारों का उपयोग बुरा अभ्यास नहीं है; एपीआई को बदलने के लिए यह बुरा अभ्यास है क्योंकि जावा अब एनम्स के लिए समर्थन कर रहा है। नए एपीआई के लिए, मैं सहमत हूं कि हर किसी ने क्या कहा।

+0

ओवरलोडिंग? लाइकोनो को मेरी टिप्पणी की प्रतिलिपि: "इस पर मेरा विचार था कि एक एनम में गैर प्लेटफार्म विशिष्ट सेटिंग्स के लिए मैपिंग विवरण हो सकते हैं, दोनों को केवल तारों का उपयोग नहीं किया जाना चाहिए, और उस स्ट्रिंग विधियों को अवमूल्यन को प्रोत्साहित करने के लिए बहिष्कृत किया जाना चाहिए" –

12

यदि पैरामीटर का सेट सीमित है और संकलन समय पर जाना जाता है, तो enum का उपयोग करें।

यदि आपके पैरामीटर का सेट संकलित समय पर खुला और अनजान है, तो स्ट्रिंग का उपयोग करें।

1

हालांकि enums का उपयोग करना सुरक्षित है, तो enum को स्ट्रिंग और इसके विपरीत रूपांतरित करने की आवश्यकता काफी बार होती है। और जावा में ऐसा करने के लिए कोई अंतर्निहित सुविधा नहीं है। और आप अंततः valueOf() और toString() का उपयोग कर समाप्त हो जाएंगे। और उस दृष्टिकोण का उपयोग केवल तारों का उपयोग करने से बहुत अलग नहीं होगा। क्योंकि आपको उन स्थितियों को संभालने की आवश्यकता होगी जहां स्ट्रिंग को एनम में परिवर्तित नहीं किया जा सकता है।

तो स्थिर स्थिर तारों का उपयोग करना आसान है और एक सामान्य अभ्यास है, AFAIK।

उदाहरण के लिए, आप कुछ एपीआई का उपयोग कर सर्वर से बातचीत करना चाहेंगे। आपको हर विधि और एनम के रूप में प्रतिक्रिया को परिभाषित करने की आवश्यकता होगी। और फिर आपको स्ट्रिंग और वैल्यूऑफ विधियों को जोड़ना होगा। स्ट्रिंग का उपयोग क्यों न करें?

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