2010-10-24 14 views
5

को देखते हुए:जेएनआई में एनम पर स्विच करें?

enum Foo 
{ 
    FIRST, 
    SECOND 
} 

निम्न कोड के लिए JNI बराबर क्या है?

Foo foo = ...; 
int value; 
switch (foo) 
{ 
    case FIRST: 
    value = 1; 
    break; 
    case SECOND: 
    value = 2; 
    break; 
} 

मैं जानता हूँ कि मैं JNI से foo.equals(Foo.FIRST) उपयोग कर सकते हैं, लेकिन मैं switch(enum) रूप में एक ही प्रदर्शन प्राप्त करना चाहते हैं। कोई विचार?

उत्तर

3

आपके पास एक प्रक्रिया चरण हो सकता है जो enum संकलित होने के बाद चलता है लेकिन जेएनआई कोड संकलित होने से पहले। यह enum लोड करेगा और मान को .h फ़ाइल में आउटपुट करेगा। आपके जेएनआई कोड में यह .h फ़ाइल शामिल है।

संपादित करें:

यहाँ कुछ कोड है कि इस करता है। इसे तर्क स्वीकार करने और System.out के बजाय फ़ाइल में लिखने के लिए संशोधित करने की आवश्यकता है, लेकिन ऐसा करने में काफी आसान है।

URL u = new File("/home/adam/tmp").toURL(); 
    URLClassLoader loader = new URLClassLoader(new URL[] {u}, Test.class.getClassLoader()); 
    Class<? extends Enum> c = (Class<? extends Enum>) loader.loadClass("Color"); 
    PrintStream out = System.out; 
    out.println("#ifndef COLOR_H"); 
    out.println("#define COLOR_H"); 
    for(Enum constant : c.getEnumConstants()) { 
     out.println("#define " + c.getCanonicalName().replaceAll("\\.", "_") + "_" + constant.name() + " " + constant.ordinal()); 
    } 
    out.println("#endif"); 
+0

के साथ लिखा है मैंने आपके प्रस्ताव को जेस में लागू किया है: https://sourceforge.net/projects/jace/ – Gili

+0

Glad I मदद कर सकता है। –

+1

आपको इसकी आवश्यकता नहीं है। जवाह पहले से ही ऐसा करता है। – EJP

1

क्या आप value के रूप में संदर्भ दे रहे वास्तव में enum

की क्रमसूचक है मूल्य प्राप्त कर रहा है को प्राप्त करने, सरल आप में एक निजी क्षेत्र के रूप में यह दुकान FooEnum:

 
public enum FooEnum { 
    private final int value; 

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

    public int getValue() { 
     return value; 
    } 

    FIRST(1); 
} 

इस तरह से आप कर सकते हैं अपने FooEnum मान के आधार पर स्विच करें।

+0

क्यों FooEnum एक enum के बजाय कक्षा के रूप में घोषित किया गया है? –

+0

गलती से, मैंने इसे पुराने स्टाइल एनम – Bivas

1

साथ ही आप, अपने JNI कोड में एक स्विच बयान का उपयोग करता है, तो आप कर सकते हैं:

  • अपने जावा enum वर्ग में एक अभिन्न मूल्य क्षेत्र प्रदान करें।
  • सी या सी ++ में अभिन्न स्थिरांक के समानांतर सेट को परिभाषित करें (उदा।, किसी अन्य enum द्वारा)।

अनावश्यक परिभाषा विचलन का जोखिम पेश करती है। आप इसे कम कर सकते हैं:

  • भारी तरफ दोनों तरफ समानांतरता को दस्तावेज करना। यदि गणना छोटी है और बार-बार बदलती है तो यह सबसे अच्छा काम करता है।
  • एक स्रोत से कोड उत्पन्न करना।

उदाहरण के लिए, जावा में, आप हो सकता है:

public enum Foo { 
      FIRST(0), 
      SECOND(1); 

      public int getValue() { return m_value; } 

      private int m_value; 
      private Foo(int value) { m_value = value; } 
    } 

और सी ++ में, आप हो सकता है:

enum Foo { 
      FIRST = 0, 
      SECOND = 1 
    }; 

एक समानांतर गणना के लिए, मैं व्यक्तिगत रूप से हमेशा enum मान कर सी/सी ++ पक्ष पर स्पष्ट है। अन्यथा, दोनों तरफ एक गणक का विलोपन मूल्यों को अलग कर सकता है।

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