2010-08-27 19 views
9

यह एक तुच्छ सवाल की तरह लग सकता है लेकिन मैं थोड़ा enums के बारे में मेरी सोच में अव्यवस्थित कर रहा हूँ ..जावा enum सबसे अच्छा अभ्यास

तो मैं एक वर्ग है - के अपने DVDPLAYER बुलाया मान लीजिए - और मैं करना चाहते हैं एक enum जो प्रतिनिधित्व करता है कि यह चालू, बंद, या स्टैंडबाय है।

तो मैं कक्षा में enum डाल सकता है - यह कक्षा के बाहर समझ में नहीं आता है। मेरा सवाल यह है - क्या enum जनता होना चाहिए, ताकि अन्य वर्ग मूल्यों से पूछ सकें, या क्या मुझे इसे निजी बनाना चाहिए, और फिर "isOn", "isOFf" और "isStandby" विधियां हैं?

उत्तरार्द्ध थोड़ा सा गड़बड़ लगता है, लेकिन मुझे यकीन नहीं है कि यह भी एक अच्छा विचार है कि जनता के रूप में भी enum है।

उत्तर

8

मैं कहूंगा कि यह इसे सार्वजनिक बनाने के लिए एक अच्छा विचार है। मुख्य कारण यह है कि आवेदन का विस्तार करना आसान है क्योंकि जब भी आप कोई राज्य जोड़ते हैं तो आपको नई विधियों को जोड़ने के बारे में सोचना नहीं होगा।

यदि आप इसे सार्वजनिक करने का निर्णय लेते हैं, तो आपको इसे शीर्ष-स्तरीय enum के रूप में माना जाना चाहिए। मैं वास्तव में नहीं देखता कि आप क्यों कहते हैं "यह कक्षा के बाहर समझ में नहीं आता है"। मुझे लगता है कि DVDPlayerState पूरी तरह से ठीक सार्वजनिक/शीर्ष-स्तरीय enum की तरह लगता है।

+0

मैंने सोचा कि राज्य को DVDPlayer से अलग नहीं होना चाहिए - इसका केवल डीवीडीप्लेयर के संबंध में अर्थ है। – pecks

+6

एक ही समय में, यह हो सकता है। आपके पास एक डीवीडीप्लेयर रीमोट कंट्रोल हो सकता है जो कि डीवीडीप्लेयर के राज्यों में कितना रुचि रखता है। – mikek

+0

सच। मैंने इसे यहां पोस्ट करने के लिए ओडर में उदाहरण बदल दिया है, इसलिए मैंने शायद इसे इतना नहीं सोचा है! – pecks

2

यह कैसे आप बाहर की दुनिया से DVDPlayer वर्ग का उपयोग करना चाहते पर निर्भर करता है:

if (dvdPlayer.getState() == State.ON) 

या

if (dvdPlayer.isOn()) 

मुझे लगता है कि पहले एक एक बेहतर विकल्प है। आपको प्रतिनिधि कोड के साथ अपने कोड को प्रदूषित करने की आवश्यकता नहीं है।

+0

आप सही हैं, यह वही है जो यह नीचे आता है। – pecks

+1

असल में मैं बाद वाले को पसंद करूंगा क्योंकि isn() एक राज्य द्वारा इसका अर्थ क्या हो सकता है, उसके आस-पास अपने सिर को लपेटने से बहुत तेज पढ़ता है, जिसके लिए आपको पहले enum को देखने की आवश्यकता होगी। –

0

एनम जनता बनाना समझ में आ सकता है।

DvdPlayer.State getState(); 

आप केवल तीन राज्यों है, तो यह ison, isOff, और isStandby तरीकों का उपयोग करने के लिए बेहतर हो सकता है: आप तो कुछ इस तरह होगा। अधिक राज्यों के लिए सार्वजनिक enum बेहतर है। एक स्विच स्टेटमेंट में भी एक enum का उपयोग किया जा सकता है, जो सुविधाजनक है।

2

अंगूठे के नियम के रूप में आप चीजों को यथासंभव निजी रखना चाहते हैं (हालांकि आमतौर पर, यह enums के साथ उपयोग का मामला नहीं है), लेकिन जिस तरह से आपका प्रश्न सामने आया है, मुझे यकीन नहीं है कि आप enums का उपयोग कर रहे हैं जैसा सोचा वैसा।

आप निश्चित मूल्यों का प्रतिनिधित्व करने के लिए एक enum का उपयोग करना चाहते हैं; यह इन मानों को स्थिर अंतिम इंटीग्रर्स या स्ट्रिंग्स के रूप में सहेजने के लिए क्लीनर विकल्प है। एक enum के रूप में

public enum DvdState { ON, OFF, STANDBY }; 

घोषित के लिए तो आपका वर्ग इस तरह एक सा दिखेगा:

public class DvdPlayer { 
    private DvdState state = DvdState.OFF; 

    public void setState(DvdState state) { 
     this.state = state; 
    } 
} 

और एक कॉलिंग वर्ग निम्न कोड का प्रयोग करेंगे: यदि enum है

dvdPlayer.setState(DvdState.ON); 
+0

सोचने का यह तरीका ओवर-इंजीनियरिंग की तरह लगता है। मैं एक खिलाड़ी को चालू या बंद करना चाहता हूं। कोई भी कभी नहीं कहता कि वह खिलाड़ी की स्थिति बदलना या सेट करना चाहता है ... –

0

सार्वजनिक इंटरफ़ेस का हिस्सा, इसे सार्वजनिक घोषित करना समझ में आता है। ऐसा लगता है कि DVPlayer के साथ मामला है, क्योंकि आप कहते हैं कि इसकी पूछताछ की जा सकती है।तीन विधियों "isOn", "isOFf" और "isStandby" अनावश्यक रूप से सार्वजनिक इंटरफ़ेस को फहराता है।

एक enum वर्ग के भीतर उपयोग करते हैं, जिस स्थिति में यह निजी घोषित किया जाना चाहिए के लिए काम में आता है जब लेकिन कई बार कर रहे हैं। उदाहरण के लिए, घोषणा के बाद

private enum Format{DVD, BLURAY}; 

, ठीक हो जाएगा अगर स्वरूपDVDPLAYER कक्षा में आंतरिक रूप से उपयोग लेकिन या तो एक विधि का एक पैरामीटर या वापसी मान के रूप में सार्वजनिक इंटरफ़ेस का हिस्सा नहीं है है जाएगा।

0

मुझे लगता है कि मैं यहां विधियों के उपयोग की वकालत करने वाले पहले व्यक्ति बनने वाला हूं। सबसे पहले, अपनी कक्षा के उपयोगकर्ताओं के बारे में सोचें। जितना कम उन्हें आपके व्यवसाय डोमेन के बारे में जानने की आवश्यकता है, उतना ही बेहतर, इसलिए उन्हें "राज्य" जैसी चीज़ों से भ्रमित न करें। आप वास्तविक जीवन में एक डीवीडी प्लेयर के "राज्य को" सेट नहीं करेंगे, लेकिन बस इसे चालू करें या "बंद करें अगर", जो मुझे विधियों के लिए चिल्लाता है। उस जावा के अलावा सख्ती से स्थाई रूप से टाइप होने के लिए जाना जाता है और प्यार करता है, जो आपको अपने आईडीई के ऑटो-पूर्ण सुझावों से पूरी तरह इंटरफ़ेस खोजने की अनुमति देता है। एक विधि पढ़ना turnOff तुरंत मुझे समझ में आता है, जबकि setState संदिग्ध है और मुझे यह जानने के लिए पहले राज्य enum देखने की आवश्यकता होगी कि वास्तव में राज्य क्या हो सकता है।

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