इंटम वैल्यू को इंट में कैसे बदलें?


240

मेरे पास एक फ़ंक्शन है जो एक प्रकार का इंट लौटाता है। हालाँकि, मेरे पास केवल TAX गणना का मूल्य है।

मैं TAX एन्यूमरेशन वैल्यू को इंट में कैसे डाल सकता हूं?

public enum TAX {
    NOTAX(0),SALESTAX(10),IMPORTEDTAX(5);

    private int value;
    private TAX(int value){
        this.value = value;
    }
}

TAX var = TAX.NOTAX; // This value will differ

public int getTaxValue()
{
  // what do do here?
  // return (int)var;
}

1
मुमकिन है कि
एनुम

जवाबों:


354

आपको एनम को valueकिसी भी तरह उजागर करने की आवश्यकता होगी , जैसे

public enum Tax {
    NONE(0), SALES(10), IMPORT(5);

    private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public int getValue() {
        return value;
    }
}

...

public int getTaxValue() {
    Tax tax = Tax.NONE; // Or whatever
    return tax.getValue();
}

(मैंने नामों को थोड़ा अधिक पारंपरिक और पठनीय, btw होने के लिए बदल दिया है।)

यह मान रहा है कि आप कंस्ट्रक्टर में निर्दिष्ट मान चाहते हैं। यदि आप ऐसा नहीं चाहते हैं, तो आपको हमें और जानकारी देने की आवश्यकता होगी।


1
@likejiujitsu: यह विपरीत दिशा में जा रहा है। इस प्रश्न में, ओपी में पहले से ही मूल्य का प्रकार है Tax, और इससे संख्यात्मक मान प्राप्त करना चाहता है।
जॉन स्कीट

मैंने अभी इसकी कोशिश की और महसूस किया कि यह विफल रहता है myEnumValue = MyEnum.valueOf(myInt);कि आर्ग टाइप स्ट्रिंग का होना चाहिए - या कुछ ऐसा है जो मुझे याद आ रहा है?
जैसे कि 22

यह समाधान कुछ भी नहीं से भी बदतर है। जावा में Enums लगता है बस इस्तेमाल नहीं किया जाना चाहिए? या JDK 1.8 ने इसे बदल दिया है?
इब्रोब

@ebyrob: मतदान को देखते हुए, ऐसा लगता है कि बहुत से लोग आपसे असहमत हैं, जैसा कि मैं करता हूं। यदि आप मानों का एक निश्चित सेट चाहते हैं, तो एनम बिल्कुल ठीक हैं।
जॉन स्कीट

209

यह मेरे लिए ज़्यादा प्रधान है:

public enum Color {

   White,

   Green,

   Blue,

   Purple,

   Orange,

   Red
}

फिर:

//cast enum to int
int color = Color.Blue.ordinal();

34
यह जोशुआ बलोच ने अपनी पुस्तक इफेक्टिव जावा (2 डी एड) में गलत / अनुशंसित नहीं है। मद 31 देखें।
13:50 पर user504342

43
@ user504342 मेरे पास पुस्तक का दूसरा संस्करण नहीं है, तो क्या आप हमें यह सुझाव दे सकते हैं कि यह अनुशंसित क्यों नहीं है?
likejudo

17
2 कारण: एक, क्रमिक मूल्यों और स्थिरांक के बीच कोई भी संबंध यदि नए स्थिरांक जोड़े जाते हैं, और दो एपीआई डॉक्स विशेष रूप से इसके खिलाफ सलाह देते हैं।
jordanpg

8
इतना साफ और परिपूर्ण। मुझे कुछ "ऐसा नहीं करते" और "अनुशंसित नहीं" दिखाई देता है। मुझे इस पर शोध करना होगा कि इसे बुरा क्यों माना जाता है। कुछ फूले हुए नमूने खराब IMO दिखते हैं। इतना सरल काम करने के लिए इतना काम।
हर्ब मीहान

4
एक टीम में, आपको पूरा यकीन है कि आपके सह-डेवलपर को बीच में एक मूल्य जोड़ देगा (शुरुआत में बदतर), या बस उन्हें सॉर्ट करें क्योंकि उन्हें कुछ भी नहीं करना है और कोड का उपयोग पूरी तरह से गड़बड़ करना है.ordinal()
माइकल लाफार्ग

18

यदि आप चाहते हैं कि मान जो आप कंस्ट्रक्टर में असाइन कर रहे हैं, तो आपको उस मान को वापस करने के लिए enum परिभाषा में एक विधि जोड़ने की आवश्यकता है।

यदि आप एक अद्वितीय संख्या चाहते हैं जो एनम मूल्य का प्रतिनिधित्व करते हैं, तो आप उपयोग कर सकते हैं ordinal()


2
सावधान रहे। कई और अधिक विकासात्मक विरोधी प्रतिमान हैं, जिनके ordinal()लिए मान्य उपयोग मामलों पर निर्भर हैं ordinal()। यदि आप के लिए एक अद्वितीय मूल्य को स्टोर करने की आवश्यकता है enum, तो बस स्टोर करें enum। वहाँ EnumSets, Enums की सूची, EnumMaps, और लगभग किसी भी अन्य Enum संग्रह आप उपलब्ध चाहते हो सकता है।
एडविन बक

1
@EdwinBuck: यह इंगित करने के लिए अच्छा है, मैं सिर्फ ordinal()इसलिए अस्तित्व का उल्लेख करना चाहता था क्योंकि ओपी ने यह स्पष्ट नहीं किया था कि वह वास्तव में क्या चाहता था।
अनहेल्सेम्प्लेर

नहीं मिलता है। कृपया इस बारे में enum api की जाँच करें। अप-वोट हटाया गया
ईल

3
मुझे आश्चर्य है कि ordinal()आंतरिक रूप से एनम के उपयोग के बारे में लोगों के विचार क्या हैं । उदाहरण के लिए, मैं एक enum "कहा जाता है का कहना है कि Season" जो मान हैं Spring, Summer, Autumn, और Winter, और यह एक सार्वजनिक विधि का आह्वान किया है next()जो रिटर्न values()[(ordinal() + 1) % 4] बाह्य, कोई कोड कभी क्रमसूचक संख्या, देखता है और वहाँ इस enum में अतिरिक्त सदस्य कभी नहीं होगा, तो यह एक वैध उपयोग-मामला जैसा लगता है।
डारेल हॉफमैन

1
@DarrelHoffman मेरी भावना यह है कि ऐसा करना ठीक है, क्योंकि एकमात्र मजबूत तर्क मैं ordinal()दूर दराज के कोड पर काज का उपयोग करने के खिलाफ देखता हूं, जो कि एनम एन्यूमरेशन कॉन्स्टेंट्स में बदलाव से टूट रहा है। यदि आप एनम के कॉन्स्टेंट को संशोधित करने जा रहे हैं, तो आपको पहले से ही उस फ़ाइल में रहना होगा। अधिकांश एनम काफी कम हैं, और यदि यह नहीं है तो आपको फ़ाइल को और अधिक अच्छी तरह से जांचना चाहिए। दोनों ही मामलों में आपको अपनी next()विधि को किसी भी तरह से कवर करना चाहिए ।
एलन हेंसले

12

शायद ही कभी कुछ C # दृष्टिकोण जावा दुनिया में जीवन को आसान बनाता है ..:

class XLINK {
static final short PAYLOAD = 102, ACK = 103, PAYLOAD_AND_ACK = 104;
}
//Now is trivial to use it like a C# enum:
int rcv = XLINK.ACK;

मेरे लिए यह जाने का सबसे वांछनीय तरीका है। मुझे एनम (कोड स्पष्टता) का लाभ मिलता है, एक डेटा प्रकार जो डीबी फ्रेंडली है, और मुझे इसे "एंड्रॉइड वे" करने के लिए 100 एनुम विकल्पों पर शोध करने की आवश्यकता नहीं है। सरल और प्रभावी।
जॉन वार्ड

अच्छा लगा। यह ऐसा है मानो जावा एनम केवल वास्तविकता के लिए पूरी तरह से डिस्कनेक्ट हो गया है कि एनम किस चीज के लिए उपयोग किया जाता है ... खासकर अगर लोग फिर सिंगलेट्स जैसी चीजों के लिए इसका दुरुपयोग करना शुरू कर देते हैं। इस दृष्टिकोण का नुकसान यह है कि इसके पास सभी मूल्यों को प्राप्त करने का एक आसान तरीका नहीं है।
Nyerguds

क्या यह एक विधि के लिए एक enum मान को पारित करने की कोशिश करने का नुकसान नहीं है? आप अब एक XLINK को एक विधि से नहीं पारित कर सकते हैं, क्योंकि यह कुछ भी ठोस का प्रतिनिधित्व नहीं करता है। आप अपनी पद्धति में टाइपिंग खो देते हैं। XLINK के बजाय विधि हस्ताक्षर को कम पढ़ना होगा।
डस्टिन जेन्सन

2

हो सकता है कि पूर्णांक की तुलना में स्ट्रिंग प्रतिनिधित्व का उपयोग करना बेहतर हो, क्योंकि स्ट्रिंग अभी भी मान्य है यदि मान एनम में जोड़े जाते हैं। Enum मान को Stum में परिवर्तित करने के लिए आप enum के नाम () विधि का उपयोग कर सकते हैं। Enum के valueOf () विधि को फिर से String से Enum प्रतिनिधित्व बनाने के लिए। निम्न उदाहरण दिखाता है कि Enum मान को स्ट्रिंग और बैक में कैसे बदला जाए (ValueType एक enum है):

ValueType expected = ValueType.FLOAT;
String value = expected.name();

System.out.println("Name value: " + value);

ValueType actual = ValueType.valueOf(value);

if(expected.equals(actual)) System.out.println("Values are equal");

1
public enum Tax {

NONE(1), SALES(2), IMPORT(3);

private final int value;
    private Tax(int value) {
        this.value = value;
    }

    public String toString() {
        return Integer.toString(value);
    }
}

class Test {
    System.out.println(Tax.NONE);    //Just an example.
}

0

कुछ हद तक अलग दृष्टिकोण (कम से कम एंड्रॉइड पर) इंट कॉन्स्टेंट एनोटेशन का उपयोग इंट कॉन्स्टेंट के एक सेट को संयोजित करने के लिए किया जाता है

@IntDef({NOTAX, SALESTAX, IMPORTEDTAX})
@interface TAX {}
int NOTAX = 0;
int SALESTAX = 10;
int IMPORTEDTAX = 5;

फ़ंक्शन पैरामीटर के रूप में उपयोग करें:

void computeTax(@TAX int taxPercentage){...} 

या एक चर घोषणा में:

@TAX int currentTax = IMPORTEDTAX;
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.