Java将变量名称作为字符串

时间:2014-05-24 14:36:55

标签: java

final static int 
    DRAGON = 5,
    SNAKE = 6;

String this_item = "DRAGON";
int item_value = super_func(this_item);//must be 5

是否可以实现此super_func,如上所示?

或许我要求的太多了?

修改

我不允许使用枚举。我可以:

a)使用地图(如某人所指,或2个数组列表)或
b)以一些亲的方式做到这一点(但似乎不可能)。

5 个答案:

答案 0 :(得分:3)

我不知道这个值应代表什么,但您可以使用Enum

enum Animal {
    DRAGON(5),
    SNAKE(6);

    private final int a;

    private Animal(int a){
        this.a = a;
    }

    public int getA(){
        return a;
    }
}

然后

String this_item = "DRAGON";
int item_value = Animal.valueOf(this_item).getA();//5

答案 1 :(得分:2)

您可以使用 Java Reflection 技巧获取变量的值,但为什么不声明一个简单的枚举并使用它:

    enum Creature{
    DRAGON(5), SNAKE(6);
     ...
    }

答案 2 :(得分:1)

据我所知,这样的事情是不可能的,但你可以将你的变量存储在Map

HashMap<String,Integer> map = new HashMap<>();
map.put("DRAGON",5);
map.put("SNAKE",6);

int itemValue = map.get("DRAGON"); //Sets itemValue to 5

答案 3 :(得分:1)

您也可以使用switch()语句。

int item_value;
switch(this_item) {
     case "DRAGON":
         item_value = 5;
         break;
     case "SNAKE":
         item_value = 6
         break;

或不同的解决方案正好相反

private String getAnimal(int itemValue) {
     switch(item_value) {
         case 5:
             return "DRAGON";
         case 6:
             return "SNAKE";
         default:
             return null;
}

答案 4 :(得分:1)

虽然技术上可以使用反射来做到这一点,但我强烈建议您重新考虑您的结构,并考虑其他方法中提到的替代方案之一答案。

最简单的可能是使用地图

import java.util.Collections;
import java.util.LinkedHashMap;
import java.util.Map;

public class VariableNameTest
{
    private static final Map<String,Integer> map;
    static
    {
        Map<String, Integer> m = new LinkedHashMap<String, Integer>();        
        m.put("DRAGON",5);
        m.put("SNAKE",6);
        map = Collections.unmodifiableMap(m);
    }

    public static void main(String[] args)
    {
        System.out.println(getValue("DRAGON"));
        System.out.println(getValue("SNAKE"));
        System.out.println(getValue("Boo!"));
    }

    public static int getValue(String name)
    {
        Integer i = map.get(name);
        if (i == null)
        {
            // Do some error handling here!
        }
        return i;
    }
}

但是如果您打算使用其他功能来扩展它,那么您应该引入类似于https://stackoverflow.com/a/23846279/3182664

中推荐的类。

仅为完整性:反思解决方案,不推荐!

import java.lang.reflect.Field;

public class VariableNameTest
{
    static final int DRAGON = 5;
    static final int SNAKE = 6;

    public static void main(String[] args)
    {
        System.out.println(getValue("DRAGON"));
        System.out.println(getValue("SNAKE"));
        System.out.println(getValue("Boo!"));
    }

    private static int getValue(String name)
    {
        try
        {
            Class<?> c = VariableNameTest.class;
            Field f = c.getDeclaredField(name);
            return f.getInt(null);
        }
        catch (NoSuchFieldException e)
        {
            // Many things
            e.printStackTrace();
        }
        catch (SecurityException e)
        {
            // may cause
            e.printStackTrace();
        }
        catch (IllegalArgumentException e)
        {
            // this to 
            e.printStackTrace();
        }
        catch (IllegalAccessException e)
        {
            // fail horribly 
            e.printStackTrace();
        }
        return 0;
    }
}