0

ブール値と整数が混在するクラスがあります。

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

「Item1」や「Item4」などの文字列値を渡すメソッド「void addIngredient(String itemName)」もあります。

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

たとえば、if ステートメントまたはスイッチを使用せずに、変数 Soup.mItem1 の値を設定するにはどうすればよいですか。たとえば、ブール値または整数値の「mItems」変数を最大 25 個または 50 個追加できます。

基本的に、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

リフレクションでそれを行うことができますが、リフレクションには、パフォーマンスやコードの非常に緊密な結合など、多くの注意事項があります。したがって、Reflection を使用しないことをお勧めしますが、必要な場合は、このようにすることができます。

オリジナルクラス

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 に答える