0

我有一个混合了布尔值和整数的类:

class Soup {
    boolean mItem1 = false
    boolean mItem2 = false
    int     mItem3 = 10
    boolean mItem4 = false
    int     mItem5 = 100 
{

我还有一个方法“void addIngredient(String itemName)”,我将传递一个字符串值,如“Item1”或“Item4”。

void addIngredient(String itemName) {
    // I need help with the following line
    Soup.m(itemName) = true
}

例如,如何设置变量 Soup.mItem1 的值,而不使用 if 语句或开关。例如,我最多可以添加 25 或 50 个“mItems”变量,这些变量可能是布尔值或整数值。

我基本上想获取 Soup.m 并连接我传递的字符串(例如 Item1)以生成字符串“Soup.mItem1”,然后设置一个值,例如“Soup.mItem1 = true”或“Soup.nItem3 = 1000 ”。

4

3 回答 3

0

看看这篇关于如何转换作为参数或变量传入的字符串并将其分配给字段的另一篇文章。我认为这会起作用,但我仍然会做更多研究:使用字符串值创建变量名从字符串中按名称获取变量

这就是我想出的:

final Map<String, boolean> itemType = new HashMap<>();

void addIngredient(String itemName) {
itemName="m" + itemName;
itemType.put(itemName, true);
}

认为这应该有效。

于 2013-10-15T04:13:58.960 回答
0

你想使用反射

import java.lang.reflect.Field;

public class Main 
{
    private boolean mItem1;
    private int mItem2;

    public static void main(String[] args)
        throws NoSuchFieldException, 
               IllegalArgumentException, 
               IllegalAccessException 
    {
        final Main instance;

        instance = new Main();
        instance.addIngredient("Item1");
        instance.setIngredientAmount("Item2", 1000);

        System.out.println(instance.mItem1);
        System.out.println(instance.mItem2);
    }

    public void addIngredient(final String itemName) 
        throws NoSuchFieldException, 
               IllegalArgumentException, 
               IllegalAccessException
    {
        final Class<Main> clazz;
        final Field       item;

        clazz = Main.class;
        item  = clazz.getDeclaredField("m" + itemName);
        item.set(this, true);
    }

    public void setIngredientAmount(final String itemName,
                                    final int    value)
        throws NoSuchFieldException, 
               IllegalArgumentException, 
               IllegalAccessException
    {
        final Class<Main> clazz;
        final Field       item;

        clazz = Main.class;
        item  = clazz.getDeclaredField("m" + itemName);
        item.set(this, value);
    }
}

我实际上不会推荐这个,但它应该满足您的要求。

于 2013-10-15T04:19:05.710 回答
0

您可以使用反射来做到这一点,但反射有很多警告,包括性能和非常紧密的代码耦合。所以,我建议不要使用反射,但如果你必须这样做,你可以这样做。

原班

public class OriginalClass {
    public int var1;
    public String var2;
    public boolean var3;
}

主要的

import java.lang.reflect.Field;
public class Main {
    public static void main(String[] args) throws NoSuchFieldException, SecurityException, IllegalArgumentException, IllegalAccessException {
        OriginalClass orig = new OriginalClass();
        orig.var1 = 1;
        orig.var2 = "Hello";
        orig.var3 = true;
        for(int i = 0; i <= 3; i++) {
            Field origVar = OriginalClass.class.getDeclaredField("var" + i);
            System.out.println(origVar.get(orig));
        }
    }
}

或者,您可以使用getFields然后循环遍历所有字段。

for(Field origVar : orig.getFields())
    System.out.println(origVar.get(orig));

get()方法类似,在 上也有set()方法Field。签名是

void set(Object obj, Object value);

注意:通常,由于封装,您的成员变量将被隐藏,因此您必须通过它们的 getter 和 setter 访问它们,就像这样。

Method m = OriginalClass.class.getDeclaredMethod("getVar1", null);
System.out.println(m.invoke(orig));
m = OriginalClass.class.getDeclaredMethod("setVar1", Integer.TYPE);
m.invoke(orig, 3);
System.out.println(orig.var1); //Will print 3
于 2013-10-15T04:19:21.633 回答