2008-12-14 13 views
10

में स्थिरांक की बजाय enums का उपयोग करना चाहिए जावा < 1.5 में, स्थिरांक इसआप हमेशा जावा

public class MyClass { 
    public static int VERTICAL = 0; 
    public static int HORIZONTAL = 1; 

    private int orientation; 

    public MyClass(int orientation) { 
     this.orientation = orientation; 
    } 
... 

तरह लागू किया जाएगा और आप इस तरह यह प्रयोग करेंगे:

MyClass myClass = new MyClass(MyClass.VERTICAL); 

अब, 1.5 में जाहिर है आपको enums का उपयोग करना चाहिए:

public class MyClass { 
    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

और अब आप इसे इस तरह उपयोग करेंगे:

MyClass myClass = new MyClass(MyClass.Orientation.VERTICAL); 

जो मुझे थोड़ा बदसूरत लगता है। enums के सभी प्रकार के लिए सुरक्षित अच्छाई के साथ

MyClass myClass = new MyClass(MyClass.VERTICAL); 

: अब मैं आसानी से स्थैतिक चर के एक जोड़े जोड़ सकते हैं:

public class MyClass { 
    public static Orientation VERTICAL = Orientation.VERTICAL; 
    public static Orientation HORIZONTAL = Orientation.HORIZONTAL; 

    public static enum Orientation { 
     VERTICAL, HORIZONTAL; 
    } 

    private Orientation orientation; 

    public MyClass(Orientation orientation) { 
     this.orientation = orientation; 
    } 
... 

और अब मैं यह फिर से कर सकते हैं।

क्या यह अच्छी शैली, खराब शैली या न तो है। क्या आप बेहतर समाधान के बारे में सोच सकते हैं? कि enum एक प्रथम श्रेणी नागरिक होना चाहिए -

अद्यतन

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

युवाल का जवाब ठीक है, लेकिन यह वास्तव में गैर-नेस्टेड एनम पर जोर नहीं देता था। इसके अलावा, 1.4 के लिए - जेडीके में बहुत सारे स्थान हैं जो पूर्णांक का उपयोग करते हैं, और मैं वास्तव में उस तरह के कोड को विकसित करने का एक तरीका ढूंढ रहा था।

+0

पहले कोड ब्लॉक में, आप प्रत्येक चर को एक अलग मान देना चाहते थे, है ना? –

+0

क्या आपको वास्तव में अलग-अलग अभिविन्यासों की तुलना में अधिक करने के लिए कक्षा MyClass की आवश्यकता है? –

उत्तर

2

जावा के बारे में नहीं पता, लेकिन .NET में अच्छा अभ्यास कक्षाओं के समानांतर में समानता में रखना है, भले ही इसका उपयोग अकेले एक वर्ग द्वारा किया जाता है। यही कारण है, आप लिखते हैं:

namespace Whatever 
{ 
    enum MyEnum 
    { 
    } 
    class MyClass 
    { 
    } 
} 

इस प्रकार, आप उपयोग कर सकते हैं:

MyClass c = new MyClass(MyEnum.MyValue); 
5

क्या आप जानते हैं आप अभिविन्यास आयात और कहते हैं कि

MyClass myClass = new MyClass(Orientation.VERTICAL); 

कर सकते हैं?

+0

अच्छा बिंदु। हां मैंने किया, लेकिन इसका मतलब अभी भी कॉलिंग कोड में अधिक शब्दशः है (यह एक आयात लाइन जोड़ता है)। मेरी प्रेरणा कॉलिंग कोड को छोटा और क्लीनर रखना है। – Draemon

+0

मैं क्षमा चाहता हूँ, आदमी। मेरा मतलब है, मैं जावा और सभी से प्यार करता हूं, लेकिन _shorter_ इस भाषा में कभी प्राथमिकता नहीं रही है। –

+3

छोटा? क्या ... तो एक आयात लाइन के बजाय आप फिर से MyClass लिखना चाहते हैं? यह मेरे लिए कोई छोटा और न ही क्लीनर है। – arul

0

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

+0

आपके पास एक बिंदु है, लेकिन एनम का उपयोग करना थोड़ा अधिक आत्म-वर्णन है, फिर बस एक बूलियन है। –

+0

लेकिन यदि आप इसे किसी फ़ंक्शन में पास कर रहे हैं, तो आप हस्ताक्षर 'सार्वजनिक MyClass (बूलियन isVertical) बना सकते हैं। यह एकमात्र मामला है जिसका मैं उपयोग करता हूं, हालांकि। –

27

आपने इसे बहुत जटिल बना दिया। चलो इसे सब एक साथ लाओ।

public enum Color 
{ 
    BLACK, WHITE; 
} 

पूर्व जावा 1:

पोस्ट जावा 1.5 आप जावा Enum वर्ग का उपयोग करना चाहिए।दोनों तरीकों से आप यह बहुत की तरह फोन में

public class Color 
{ 
    public static Color WHITE = new Color("white"); 
    public static Color BLACK = new Color("black"); 

    private String color; 

    private Color(String s) 
    { 
     color = s; 
    } 
} 

: 5 आप टाइप सुरक्षित Enum पैटर्न का उपयोग करना चाहिए

drawBackground(Color.WHITE); 

विशेष रूप से, अपने प्रश्न के बारे में। यह कोड शैली का मामला है, लेकिन मुझे लगता है कि पसंदीदा तरीके अपने अलग वर्गों में enums रखना है। खासकर जब वे getName(), getId() इत्यादि जैसे अपने तरीके प्राप्त करने लगते हैं ... इसे कक्षा के रूप में अव्यवस्थित होने के बाद, नियमित वर्ग बनाम अज्ञात वर्ग के समान दुविधा के रूप में सोचें, अब इसे अपने आप में ले जाने का समय है फ़ाइल।

0

तुम भी MyClass पर दो स्थिर तरीकों हो सकता है:

MyClass.Vertical() : MyClass 
MyClass.Horizontal() : MyClass 

उन उचित enum सेट के साथ एक नया उदाहरण वापस आ जाएगी।

0

मैं मानता हूं कि आप रचनात्मक थे लेकिन मुझे लगता है कि यह एक व्यावहारिक समाधान नहीं है और मुझे लगता है कि आपने कोड के एक अलग हिस्से में "कुरूपता" को स्थानांतरित कर दिया है। क्या होता है यदि वर्टिकल और हॉरिज़ोनल के अतिरिक्त, आपके पास डायगोनल, एए, बीबी, सीसी, आदि भी होगा? क्या आपको प्रत्येक स्थिर स्थिरता टाइप करके डुप्लिकेट करना होगा? आपका स्वाद है कि MyClass.Orientation.VERTICAL बदसूरत है व्यक्तिगत हो सकता है?

+0

मैं मानता हूं कि मैंने केवल कुरूपता को स्थानांतरित कर दिया है, लेकिन मैं कॉलिंग कोड के विरोध में हमेशा कोड कहलाता हूं। यह बिल्कुल व्यक्तिगत है, और मुझे यह भी यकीन नहीं है कि मुझे विकल्प पसंद है, इसलिए मैं परिप्रेक्ष्य मांग रहा हूं। मैं निष्कर्ष पर आ रहा हूं कि एक अलग वर्ग सबसे अच्छा होगा। – Draemon

0

ऐसे मामलों का एक महत्वपूर्ण वर्ग है जहां आपको enum एस के बजाय स्थिरांक का उपयोग करना चाहिए। यह तब होता है जब आप स्थिरांक का उपयोग करके अंकगणित करना चाहते हैं, या संख्यात्मक मानों के साथ तुलना करें। तो आपको वास्तव में int, long या double होने की आवश्यकता है।

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

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